C# Lambda IfThenElse表达式,其中包含另一个Lambda(对于SetQueryFilter())
我的目标是为C# Lambda IfThenElse表达式,其中包含另一个Lambda(对于SetQueryFilter()),c#,linq,lambda,expression,expression-trees,C#,Linq,Lambda,Expression,Expression Trees,我的目标是为IMutableEntityType设置过滤器,在这里我通过currentTentid列值选择数据行。 有关更多上下文,请参阅: 我已经做到了: var parameter = Expression.Parameter(entityType.ClrType, "p"); // TODO: This filter is working, but we must prevent filtering with TenantId = 0
IMutableEntityType
设置过滤器,在这里我通过currentTentid
列值选择数据行。
有关更多上下文,请参阅:
我已经做到了:
var parameter = Expression.Parameter(entityType.ClrType, "p");
// TODO: This filter is working, but we must prevent filtering with TenantId = 0
var workingFilter = Expression.Lambda(
Expression.Equal(
Expression.Property(parameter, colName),
// See https://github.com/dotnet/efcore/issues/23718
Expression.MakeMemberAccess(Expression.Constant(myContext), currentTenantIdMemberInfo)
),
parameter);
entityType.SetQueryFilter(filter);
但是我想得到所有实体,如果TenantId==0
,那么我写了这个Lambda:
var conditionalExpression = Expression.IfThenElse(
// Check if TenantId > 0
Expression.GreaterThan(
Expression.MakeMemberAccess(Expression.Constant(myContext), currentTenantIdMemberInfo),
Expression.Constant((long) 0)
),
// build filter: (p) => p.{colName} == {myContext.CurrentTenantId}
// i.e. (p) => p.TenantId == 123)
Expression.Lambda(
Expression.Equal(
Expression.Property(parameter, colName),
// See https://github.com/dotnet/efcore/issues/23718
Expression.MakeMemberAccess(Expression.Constant(myContext), currentTenantIdMemberInfo)
)//,
),
// TenantId <= 0, so act like (p => p)
Expression.Lambda(Expression.Constant(parameter)) // just p // TODO: Not working
//Expression.Lambda(Expression.Constant(parameter), parameter) // p => p // TODO: Also not working...
);
var filter = Expression.Lambda(conditionalExpression);
我的问题是——我怎样才能实现我的目标?类似这样的问题。您没有向Lambda添加
参数
,并且在Lambda的使用上犯了错误。还选择了最短的方法来实现这一点
var parameter=Expression.parameter(entityType.ClrType,“p”);
//EF只需要知道您拥有DbContext的成员访问权限
var contextExpr=Expression.Constant(null,typeof(MyContext));
var tenantexterpr=Expression.MakeMemberAccess(contextExpr,currentTenantItemMemberInfo);
var conditionalExpression=Expression.OrElse(
//检查租户是否感谢您。我三天前已经以同样的方式实施了它-EF核心团队的Smit更快地回答了它(请参阅我问题中的URL)。我将您的回答标记为已接受。圣诞快乐,新年快乐。
'The filter expression '() => IIF((value(My.Project.MyContext).CurrentTenantId > 0), () => (p.TenantId == value(My.Project.MyContext).CurrentTenantId), () => p)' specified for entity type 'MyEntity' is invalid. The expression must accept a single parameter of type 'My.Project.MyEntity' and return bool.'