【问题标题】:Extend the Where method for IQueryable [duplicate]扩展 IQueryable 的 Where 方法
【发布时间】:2014-07-20 14:26:59
【问题描述】:

我想将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 =&gt; (p.Field== "SomeString")},但 Call 方法抛出以下异常:

“'System.InvalidOperationException' 类型的异常发生在 System.Core.dll 但未在用户代码中处理,附加 信息:“System.Linq.Queryable”类型上没有通用方法“Where” 与提供的类型参数和参数兼容。无类型 如果方法是非泛型的,则应提供参数。"

如何为Where 提供所需的参数?

谢谢。

【问题讨论】:

  • 请勿转载、编辑和改进原始问题。

标签: c# linq entity-framework linq-to-entities entity-framework-6


【解决方案1】:
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);
    }

【讨论】:

  • 太简单了!!!非常感谢。
猜你喜欢
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多