我想创建一个查询构建器来动态生成报表查询
假设我们在DB中有类似的东西来存储任务
我在我的存储库中写了这个方法
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类型来调用我的方法,并通过实体属性名称动态生成谓词表达式。
提前致谢
答案 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);