【发布时间】:2017-04-11 13:49:53
【问题描述】:
我有一个名为 TestObject 的类,带有 Name 参数。
我创建一个列表并添加其中 2 个。我想为任何IQueryable<T> 创建一个通用的Where() 子句方法。
我一直在玩 Expressions,但我真的不知道自己在做什么。
我用一些硬编码值创建了这个方法用于测试,我希望它能够做到collection.Where(c => c.Name == "Boris"):
public static IQueryable<T> Apply<T>(IQueryable<T> collection)
{
var parameterName = "Name";
var searchValue = "Boris";
var selectorParameter = Expression.Parameter(typeof(T), parameterName);
var searchTermExpression = Expression.Constant(searchValue);
var checkEqualsExpression = Expression.Call(selectorParameter, typeof(string).GetMethod("Equals"), searchTermExpression);
var methodCallExpression = Expression.Call(typeof(Queryable),
"Where",
new Type[] { collection.ElementType },
collection.Expression,
Expression.Lambda<Func<T, bool>>(checkEqualsExpression , ?????));
return collection.Provider.CreateQuery<T>(methodCallExpression);
}
我不确定????? 中的内容,或者即使这是正确的。谁能给点建议?
【问题讨论】:
-
您确定
Expression.Parameter(typeof(T), parameterName)参数名称的类型是T。这是T的属性(我猜这是一个字符串)。你可能需要Expression.Property()来做这个 -
我不知道,我从另一个网站复制并粘贴了它,该网站做了与我想要的类似的事情,我正在努力让它工作,但我真的不知道我在做什么.
标签: c# generics expression-trees