Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda IfThenElse表达式,其中包含另一个Lambda(对于SetQueryFilter())_C#_Linq_Lambda_Expression_Expression Trees - Fatal编程技术网

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.'