如何构建表达式以将 Where 子句一般应用于 IQueryable<T>?
How do I build an expression to apply a Where clause generically to an IQueryable<T>?
我有一个名为 TestObject
的 class,带有 Name
参数。
我创建了一个列表并添加了其中的 2 个。我想为任何 IQueryable<T>
.
创建一个通用的 Where()
子句方法
我一直在玩弄表达式,但我真的不知道自己在做什么。
我用一些硬编码的值创建了这个方法用于测试,我希望它做 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);
}
我不确定 ?????
中的内容,甚至不确定这是否正确。谁能给点建议?
这是一个如何做的例子,带有注释,它应该澄清你做错了什么。
public static IQueryable<T> Apply<T>(IQueryable<T> collection) {
var propertyName = "Name";
var searchValue = "Boris";
// we have parameter "c"
var selectorParameter = Expression.Parameter(typeof(T), "c");
// constant "Boris"
var searchTermExpression = Expression.Constant(searchValue);
// "c.Name"
var selector = Expression.PropertyOrField(selectorParameter, propertyName);
// "c.Name == "Boris"
var equal = Expression.Equal(selector, searchTermExpression);
// c => c.Name == "Boris"
var where = Expression.Lambda<Func<T, bool>>(equal, selectorParameter);
return collection.Where(where);
}
我有一个名为 TestObject
的 class,带有 Name
参数。
我创建了一个列表并添加了其中的 2 个。我想为任何 IQueryable<T>
.
Where()
子句方法
我一直在玩弄表达式,但我真的不知道自己在做什么。
我用一些硬编码的值创建了这个方法用于测试,我希望它做 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);
}
我不确定 ?????
中的内容,甚至不确定这是否正确。谁能给点建议?
这是一个如何做的例子,带有注释,它应该澄清你做错了什么。
public static IQueryable<T> Apply<T>(IQueryable<T> collection) {
var propertyName = "Name";
var searchValue = "Boris";
// we have parameter "c"
var selectorParameter = Expression.Parameter(typeof(T), "c");
// constant "Boris"
var searchTermExpression = Expression.Constant(searchValue);
// "c.Name"
var selector = Expression.PropertyOrField(selectorParameter, propertyName);
// "c.Name == "Boris"
var equal = Expression.Equal(selector, searchTermExpression);
// c => c.Name == "Boris"
var where = Expression.Lambda<Func<T, bool>>(equal, selectorParameter);
return collection.Where(where);
}