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,噢。。。。非常感谢。它起作用了!!!!!!!!!!斯特隆上师,谢谢你的回答,我很感激。祝你今天愉快@伊格纳特拉很乐意帮忙!