C# 表达式转换

C# 表达式转换,c#,entity-framework,lambda,expression-trees,C#,Entity Framework,Lambda,Expression Trees,我对表达式还是有点生疏,很难弄明白这个问题。这可能更像是EF的Lambda表达式问题,但我希望有人至少能为我指出正确的方向: 我正在尝试执行以下操作: internal static IQueryable<TSource> WithSecurity<TSource>(thisIQueryable<TSource> source, Expression<Func<Security.Access, TSource, bool>> predi

我对表达式还是有点生疏,很难弄明白这个问题。这可能更像是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子句上,显然存在一个问题,因为谓词是表达式类型,而Any是预期表达式。对于如何转换的任何帮助,我们将不胜感激。

我想您需要的是编译方法:

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

注意编译是一种比较昂贵的操作,所以如果在典型的场景中用相同的表达式频繁调用该方法,考虑从编译中缓存结果。

我认为您所要寻找的是编译方法:

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

注意编译是一个有点昂贵的操作,所以如果在典型的场景中用相同的表达式频繁调用这个方法,考虑从编译中缓存结果。但这给了我一个错误。”predicate'是一个“变量”,但像“方法”一样使用。然后看一看,我认为这正是您需要的。这感觉比它需要的更复杂。为什么不输入一个表达式作为参数?所以,您需要像where accessData.Anyad=>predicatec,ad这样的东西?是的!但这给了我一个错误。”“谓词”是一个“变量”,但像“方法”一样使用。然后看看,我认为这正是您需要的。这感觉比它需要的更复杂。为什么不输入一个表达式作为参数?这看起来很好,很有意义。但是,我收到了以下错误:指定的值不是“Edm.Int32”类型的实例参数名称:valueI使其正常工作!我将source=更改为source.Wheres=>accessData.Anyad=>compiledPredicatead,s;这起作用了。这看起来不错,很有意义。但是,我收到了以下错误:指定的值不是“Edm.Int32”类型的实例参数名称:valueI使其正常工作!我将source=更改为source.Wheres=>accessData.Anyad=>compiledPredicatead,s;这起作用了。