扩展IQueryable Where方法
本文关键字:方法 Where IQueryable 扩展 | 更新日期: 2023-09-27 18:13:49
我想把Where
扩展成这样:.WhereEqual("Field", "SomeString")
必须等于.Where(p => p.Field== "SomeString")
,这是我的代码:
public static IQueryable<T> WhereEqual<T>(this IQueryable<T> q, string Field, string Value)
{
var param = Expression.Parameter(typeof(T), "p");
var prop = Expression.Property(param, Field);
var val = Expression.Constant(Value);
var body = Expression.Equal(prop, val);
var exp = Expression.Lambda<Func<T, bool>>(body, param);
Type[] types = new Type[] { q.ElementType, typeof(bool) };
var mce = Expression.Call(
typeof(Queryable),
"Where",
types,
exp
);
return q.Provider.CreateQuery<T>(mce);
}
由于调试器,我可以看到exp
被设置为{p => (p.Field== "SomeString")}
,但Call
方法抛出以下异常:
"类型为'System '的异常。InvalidOperationException'发生在System.Core.dll,但未在用户代码中处理,附加没有泛型方法'Where'在类型'System.Linq.Queryable'与提供的类型参数和参数兼容。没有类型如果方法是非泛型的,则应提供参数。"
如何给Where
所需的参数?
谢谢。
public static IQueryable<T> WhereEqual<T>(this IQueryable<T> q, string Field, string Value)
{
var param = Expression.Parameter(typeof(T), "p");
var prop = Expression.Property(param, Field);
var val = Expression.Constant(Value);
var body = Expression.Equal(prop, val);
var exp = Expression.Lambda<Func<T, bool>>(body, param);
return System.Linq.Queryable.Where(q, exp);
}