我正在使用EF6为应用程序实现搜索/筛选UI的后端。我有一些代码用于构建表达式,以便在运行时确定DbSet的类型并将其用于Queryable.Where。如果我先将表达式强制转换为特定类型,则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://dev59.com/Y1LTa4cB1Zd3GeqPYDLQ
// 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://dev59.com/D2Ei5IYBdhLWcg3wMZ3a
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;
}
dynamicSet.Where(expression)
,这符合我曾经使用或见到此方法使用的唯一方式。 - Inagnikai