我正在使用 EF6 为应用实现搜索/筛选 UI 的后端。我有一些代码可以构建一个表达式来与Queryable一起使用。对于给定的DbSet,DbSet的类型是在运行时确定的(DBContext有很多,它们可能会改变)。如果我通过先将表达式转换为特定类型来作弊,则对 Where 的调用工作正常。否则,我得到这个错误:
'System.Linq.Queryable.Where(System.Linq.IQueryable, System.Linq.Expressions.Expression>)'的最佳重载方法匹配有一些无效参数”
我正在努力寻找一种方法来过滤DbSet,就像这样,其中底层的“表”类型是在运行时提供的。下面是一个非常简化的代码版本来说明:
void ProcessFilter(AppDbContext context, NameValueCollection filters, Type tableType)
{
// If tableType == typeof(Organisation), expression is a Expression<Func<Organisation, bool>>
var expression = GetFilterExpression(filters);
var dbset = Set(context, tableType);
dynamic dynamicSet = dbset;
// This fails
var results = Queryable.Where(dynamicSet, expression);
// see https://stackoverflow.com/questions/4285598/iqueryable-non-generic-missing-count-and-skip-it-works-with-iqueryablet
// Suppose tableType == typeof(Organisation)
// This works
var typedExpression = expression as Expression<Func<Organisation, bool>>;
var typedResults = Queryable.Where(dynamicSet, typedExpression);
}
public static IQueryable Set(DbContext context, Type T)
{
// Similar to code in
// https://stackoverflow.com/questions/21533506/find-a-specified-generic-dbset-in-a-dbcontext-dynamically-when-i-have-an-entity
var method = typeof(DbContext).GetMethods(BindingFlags.Public | BindingFlags.Instance).Where(x => x.Name == "Set" && x.IsGenericMethod).First();
// Build a method with the specific type argument
method = method.MakeGenericMethod(T);
return method.Invoke(context, null) as IQueryable;
}
慕容708150
GCT1015
相关分类