延伸IQueryable的位置

时间:2014-07-20 12:34:14

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

我需要将Where的{​​{1}}方法扩展为类似的内容:

IQueryable

我不知道这是否可行,但我在SO中发现了这一点:Unable to sort with property name in LINQ OrderBy

我尝试了这个答案,看起来很有趣(Ziad的答案):

.WhereEx("SomeProperty", "==", "value")

是否可以使用using System.Linq; using System.Linq.Expressions; using System; namespace SomeNameSpace { public static class SomeExtensionClass { public static IQueryable<T> OrderByField<T>(this IQueryable<T> q, string SortField, bool Ascending) { var param = Expression.Parameter(typeof(T), "p"); var prop = Expression.Property(param, SortField); var exp = Expression.Lambda(prop, param); string method = Ascending ? "OrderBy" : "OrderByDescending"; Type[] types = new Type[] { q.ElementType, exp.Body.Type }; var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp); return q.Provider.CreateQuery<T>(mce); } } } 方法执行相同操作?

感谢。

更新

我现在可以设置一个表达式来传递给Where方法,但我得到以下异常:&#34;没有通用方法&#39; Where&#39; on type&#39; System.Linq.Queryable&#39;与提供的类型参数和参数兼容。如果方法是非泛型的,则不应提供类型参数。&#34;

这是我的代码:

Call

请注意,我还没有使用public static IQueryable<T> WhereEx<T>(this IQueryable<T> q, string Field, string Operator, 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); } 参数,而是使用Operator进行调试。

有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:0)

我用简化的问题做了另一篇文章。链接是Here

    public static IQueryable<T> WhereEx<T>(this IQueryable<T> q, string Field, string Operator, 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);
    }