【问题标题】:How to generate dynamic IQueryable extension method如何生成动态 IQueryable 扩展方法
【发布时间】:2019-08-29 12:35:03
【问题描述】:
public static IQueryable<T> DynamicFilter<T>(this IQueryable<T> query, string Property, dynamic value) where T : class
{
    return query.Where(x => x.GetType().GetProperty(Property) == value).AsQueryable();
}

【问题讨论】:

  • 在使用AsQueryable 时务必小心。在这里,您似乎混合了IEnumerable&lt;T&gt; 和IQueryable&lt;T&gt;。如果您正在与数据库交谈,您最终会将您正在使用的表加载到内存中并在您的应用程序中执行查询,而不是在 SQL 服务器上执行并获取结果

标签: c# linq methods dynamic iqueryable


【解决方案1】:

这里的诀窍是查看编译器的作用,即编译如下内容:

using System.Linq;

public class C {
    public void M() {
        var query = Data.Where(x => x.Bar == "abc");
    }
    System.Linq.IQueryable<Foo> Data;
    class Foo {
        public string Bar {get;set;}
    }
}

看看它做了什么;如果我们look in sharplab.io,我们会看到:

public void M()
{
    IQueryable<Foo> data = Data;
    ParameterExpression parameterExpression = Expression.Parameter(typeof(Foo), "x");
    BinaryExpression body = Expression.Equal(Expression.Property(parameterExpression, (MethodInfo)MethodBase.GetMethodFromHandle((RuntimeMethodHandle)/*OpCode not supported: LdMemberToken*/)), Expression.Constant("abc", typeof(string)));
    ParameterExpression[] obj = new ParameterExpression[1];
    obj[0] = parameterExpression;
    IQueryable<Foo> queryable = Queryable.Where(data, Expression.Lambda<Func<Foo, bool>>(body, obj));
}

我们可以推断您想要类似的东西,即

var p = Expression.Parameter(typeof(T), "x");
var body = Expression.Equal(
    Expression.PropertyOrField(p, Property),
    Expression.Constant((object)value)
);
var lambda = Expression.Lambda<Func<T, bool>>(body, p);
return query.Where(lambda);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多