c# - 可查询的.包含带有表达式参数的表达式树
问题描述
我想.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, List<K> items, Expression<Func<T, 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.....
它就可以了。
解决方案
尝试从选择器表达式(即exp
)重用参数,而不是为结果表达式创建一个新参数:
Expression<Func<T, bool>> lambda =
Expression.Lambda<Func<T, bool>>(a, exp.Parameters[0]);
推荐阅读
- java - 打印数组列表的所有元素
- google-sheets - 相同的电子表格,相同的单元格,但不同的结果,不同的用户
- azure-cognitive-search - 搜索结果中带有 ping 的 Azure 搜索过滤器
- php - 无法访问对象的值
- symfony - 如何更新实体
- amazon-web-services - 如何使用 Cognito Auth 测试对 Amazon API 网关的调用
- python - Scikit-learn - 无法在 Python 中使用 fetch_openml 加载 MNIST 原始数据集
- java - Java CompletableFuture.allOf() 找不到任何数组元素
- r - Why is the given code for signature generation on a character string using hash modulo returning character(0)?
- office-ui-fabric - Office UI Fabric - PeoplePicker:无法让 createGenericItem 工作