带有EntityFramework的动态查询生成器

时间:2014-12-03 11:07:59

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

我想创建一个查询构建器来动态生成报表查询

假设我们在DB中有类似的东西来存储任务

enter image description here

我在我的存储库中写了这个方法

    public IQueryable<T> fnExecute<T>(params Expression<Func<T, bool>>[] perdicates) where T : class
    {
        try
        {
            IQueryable<T> queryable = Context.Set<T>();
            foreach (var clause in perdicates)
            {
                queryable = queryable.Where(clause);
            }

            return queryable;
        }
        catch (Exception exp)
        {
            fnLogExceptions(exp);
        }
        return null;

    }

在代码中你很容易使用这样的东西

        var result  = fnExecute<DB.TestTable>(
            s=>s.Id < 113,
            s=>s.LastName.Contains("txtFoo")
            );

我想做的是:在每个任务中,我都读取了DB中的EntityName 并通过其运算符创建谓词^ _ ^

问题在于:

无论如何我可以通过在运行时动态设置T类型来调用我的方法,并通过实体属性名称动态生成谓词表达式。

提前致谢

1 个答案:

答案 0 :(得分:1)

您可以使用反射+表达方法。例如:

Type t = typeof(DB.TestTable);
var s = Expression.Parameter(t, "s");
var l1 = Expression.Lambda(
    typeof(Func<,>).MakeGenericType(t, typeof(bool)),
    Expression.LessThan(
        Expression.PropertyOrField(s, "Id"), 
        Expression.Constant(113)
    ),
    s
);

var query = repo.GetType()
    .GetMethod("fnExecute")
    .MakeGenericMethod(t).Invoke(repo, new object[] {l1});

它应该给你相当于:

var query = fnExecute<DB.TestTable>(s=>s.Id < 113);