扩展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所需的参数?

谢谢。

扩展IQueryable 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);
    }