如何解决IQueryable<T>.Contains 带有表达式参数的表达式树
我想使用以下语法实现自定义 .Contains()
方法:
static IQueryable<T> IsContainedBy<T,K>(this IQueryable<T> source,List<K> items,Expression<Func<T,K>> exp)
这个方法应该在 items
数组中寻找巧合。 Expression<Func<T,K>> exp
提供用于比较的对象的属性。我写了以下代码:
private IQueryable<T> WhereIsContainedBy<T,K>(IQueryable<T> source,K>> exp) {
if (items == null || items.Count == 0)
return source;
MethodInfo containsMethod = typeof(List<K>).GetMethod("Contains",new[] { typeof(K) });
MethodCallExpression a =
Expression.Call(Expression.Constant(items),containsMethod,new Expression[] { exp.Body
/* Expression.Constant("31212eb5-cd5d-4f77-858a-a7ddba8e3d2c")*/ });
Expression<Func<T,bool>> lambda = Expression.Lambda<Func<T,bool>>(a,Expression.Parameter(typeof(T)));
return source.Where(lambda);
}
但我收到以下错误:
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.
但是如果我使用注释的 Expression.Constant.....
它工作得很好。
感谢您的帮助。
解决方法
尝试重用选择器表达式中的参数(即 location.href.replace(/\/[^\/]+?\.[^\/]+?$/,'/')
),而不是为结果表达式创建一个新参数:
exp
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。