表达式转换

时间:2012-09-20 15:49:07

标签: c# entity-framework lambda expression-trees

我对表达式仍然有点绿,并且难以解决这个问题。这可能更像是一个关于EF的Lambda表达式问题,但我希望有人能够指出我正确的方向:

我正在尝试执行以下操作:

internal static IQueryable<TSource> WithSecurity<TSource>(thisIQueryable<TSource> source, Expression<Func<Security.Access, TSource, bool>> predicate, params MyRoles[] roles)
{

    DL.MyContext ctx = Csla.Data.DbContextManager<DL.MyContext>.GetManager().DbContext;

    var accessData = ctx.Access.Where(e => roles.Contains((MyRoles)e.Role_ID));

    Expression x = predicate asLambdaExpression;

    source =
        from c in source
        where accessData.Any(predicate)
        select c;

    return source;
}

在where子句中,显然存在一个问题,因为谓词的类型为Expression<Func<Security.Access, TSource, bool>>,但Any期待Expression<Func<Security.Access, bool>>。任何有关如何转换的协助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找的是编译方法:

var compiledPredicate = predicate.Compile();
source = 
    from c in source 
    where accessData.Any(ad => compiledPredicate(ad, c)) 
    select c; 

请注意,Compile是一个有点昂贵的操作,因此如果在典型场景中使用相同的表达式频繁调用此方法,请考虑从Compile()缓存结果。