2

私はまだExpressionsに対して少し環境に配慮しており、この問題を理解するのに苦労しています。これはEFよりもラムダ式の問題である可能性がありますが、誰かが少なくとも私を正しい方向に向けることができることを望んでいます:

私は次のことをしようとしています:

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>>ます。変換する方法についての支援は大歓迎です。

4

1 に答える 1

0

私はあなたが探しているのはコンパイル方法だと思います:

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

Compileはややコストのかかる操作であるため、通常のシナリオでこのメソッドが同じ式で頻繁に呼び出される場合は、Compile()からの結果をキャッシュすることを検討してください。

于 2012-09-20T20:30:02.077 に答える