gpt4 book ai didi

C# 创建一个比较两个成员属性的 LambdaExpression(对于 EF Core HasQueryFilter)

转载 作者:行者123 更新时间:2023-12-03 03:12:04 27 4
gpt4 key购买 nike

我尝试在 OnModelCreating 方法(Entity Framework Core)中为具有 ClientId 属性 (int) 的所有实体应用查询过滤器。到目前为止,我能够过滤实体,但我很难为这些实体调用 HasQueryFilter。

过滤器应将当前实体的 ClientId 属性与名为 ITenantProvider 的服务中的属性进行比较。

这是我手动执行的方法:

modelBuilder.Entity<MyEntity>().HasQueryFilter(a => a.ClientId == _tenantProvider.TenantId);

不幸的是,不带 Generic 的 EF Core HasQueryFilter 方法采用 LambdaExpression:

public virtual EntityTypeBuilder HasQueryFilter([CanBeNullAttribute] LambdaExpression filter);

我不知道如何将上述调用转换为 Lambda 表达式。我当前的代码如下所示:

foreach (var entityType in modelBuilder.Model.GetEntityTypes().Where(e =>
e.GetProperties().Select(property => property.Name).Any(pName => pName.Equals("ClientId"))))
{
var clientId = entityType.FindProperty("ClientId");
if (clientId != null && clientId.ClrType == typeof(int))
{
var parameter = Expression.Parameter(entityType.ClrType, "p");
var filter = Expression.Lambda(Expression.Equal(Expression.Property(parameter, clientId.PropertyInfo), Expression.Constant(_tenantProvider.TenantId), parameter);
entityType.QueryFilter = filter;
}
}

这基本上适用于第一次调用,但由于我使用Expression.Constant,如果_tenantProvider.TenantId更改,它不适用于下一个请求。

如何在运行时将实体 ClientId 属性与 _tenantProvider.TenantId 进行比较?

最佳答案

获得相当于的运行时表达式的最简单方法

_tenantProvider.TenantId

是构建编译时无参数lambda表达式并获取其Body :

var parameter = Expression.Parameter(entityType.ClrType, "p");
var left = Expression.Property(parameter, clientId.PropertyInfo);
Expression<Func<int>> tenantId = () => _tenantProvider.TenantId;
var right = tenantId.Body;
var filter = Expression.Lambda(Expression.Equal(left, right), parameter);

关于C# 创建一个比较两个成员属性的 LambdaExpression(对于 EF Core HasQueryFilter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53777257/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com