C# IQueryable<;T>;。包含带有表达式参数的表达式树

C# IQueryable<;T>;。包含带有表达式参数的表达式树,c#,entity-framework,linq,expression,core,C#,Entity Framework,Linq,Expression,Core,我想用以下语法实现自定义.Contains()方法: 静态IQueryable IsContainedBy(此IQueryable源、列表项、表达式exp) 此方法应在项数组中查找一致性表达式exp提供要用于比较的对象的属性。我编写了以下代码: private IQueryable其中包含的内容(IQueryable源、列表项、表达式exp){ if(items==null | | items.Count==0) 返回源; MethodInfo containsMethod=typeof(Li

我想用以下语法实现自定义
.Contains()
方法:

静态IQueryable IsContainedBy(此IQueryable源、列表项、表达式exp)
此方法应在
数组中查找一致性<代码>表达式exp提供要用于比较的对象的属性。我编写了以下代码:

private IQueryable其中包含的内容(IQueryable源、列表项、表达式exp){
if(items==null | | items.Count==0)
返回源;
MethodInfo containsMethod=typeof(List).GetMethod(“Contains”,new[]{typeof(K)});
MethodCallExpression a=
Expression.Call(Expression.Constant(items),containsMethod,新表达式[]{exp.Body
/*表达式常数(“31212eb5-cd5d-4f77-858a-a7ddba8e3d2c”)*/});
表达式lambda=Expression.lambda(a,Expression.Parameter(typeof(T));
返回源。其中(λ);
}
但我得到了以下错误:

var source = new List<string>() { "31212eb5-cd5d-4f77-858a-a7ddba8e3d2c" };
var r = WhereIsContainedBy(_context.StageActions, source, a => a.StageActionId);
var a = await r.ToListAsync();

---

Where(s => List<string> { "31212eb5-cd5d-4f77-858a-a7ddba8e3d2c", }.Contains(a.StageActionId))' could not be translated.
var source=newlist(){“31212eb5-cd5d-4f77-858a-a7ddba8e3d2c”};
var r=WhereIsContainedBy(_context.StageActions,source,a=>a.StageActionId);
var a=等待r.ToListAsync();
---
其中(s=>List{“31212eb5-cd5d-4f77-858a-a7ddba8e3d2c”}.Contains(a.StageActionId))无法翻译。
但是如果我使用注释的
Expression.Constant…
它就可以正常工作


感谢您的帮助。

尝试重用选择器表达式(即
exp
)中的参数,而不是为结果表达式创建新参数:

Expression<Func<T, bool>> lambda = 
    Expression.Lambda<Func<T, bool>>(a, exp.Parameters[0]);
表达式lambda=
Lambda(a,exp.Parameters[0]);

我猜您正在使用新的
表达式创建lambda.Parameter
而不是使用
exp.Body
中的lambda,因此可以有效地使用
s=>List.Contains(a.StageActionId)
。您需要将
exp.Parameters[0]
传递给
Lambda
创建方法。不确定为什么用
String
替换
List
并调用
List.Contains
不会导致另一个错误。@NetMage,噢。。。。非常感谢。它起作用了!!!!!!!!!!斯特隆上师,谢谢你的回答,我很感激。祝你今天愉快@伊格纳特拉很乐意帮忙!