我正在.NET Core中构建MVC API。我有几个非常大的表(第三方系统),并且我试图允许将任何列的名称作为URL参数传递,并带有在Where子句中使用的值。这使用实体框架和.NET Core。想法是获取与参数名称匹配的列,并在带有参数值的Where子句中使用它。我希望where查询中的lambda最终看起来像://GET: api/DWRWorkItems?Parameter=Value...dWRWorkItem = dWRWorkItem.Where(m => m.Parameter == Value);这是我尝试的一种全新解决方案,即来自控制器的路由代码。模型和视图与实体框架创建的默认值相同。 // GET: api/DWRWorkItems [HttpGet] public IEnumerable<DWRWorkItem> GetTDwrWrkItm() { IQueryable<DWRWorkItem> dWRWorkItem = _context.TDwrWrkItm.Where(m => 1 == 1); var q = HttpContext.Request.Query; foreach (string p in q.Keys) { dWRWorkItem = dWRWorkItem.Where(m => m.GetType().GetProperty(p).GetValue(m, null) == q[p] ); } return dWRWorkItem.ToList(); }Intellisense(VS 2017)不会出现错误,但是运行此命令时,我得到:  运算符“等于”的操作数与方法“ op_Equality”的参数不匹配。单步执行代码,看来lambda中的反射未按预期工作。 dWRWorkItem.Expression.Arguments [1]如下所示:  {m =>(GetProperty(m.GetType(),值(EBOOKS.Controllers.DWRWorkItemsController + c__DisplayClass0#1).p).GetValue(m,null)==值(EBOOKS.Controllers.DWRWorkItemsController + c__DisplayClass0#1 ).CS $ 8__locals1.q.get_Item(value(EBOOKS.Controllers.DWRWorkItemsController + c__DisplayClass0#1).p))}虽然参数不是动态的示例看起来像这样:  {m =>(m.ContId == value(EBOOKS.Controllers.DWRWorkItemsController + c__DisplayClass3_0).id)} (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 通常,除LINQ to Objects之外的查询提供程序不喜欢表达式树内的反射调用,因此最好使用System.Linq.Expressions.Expression类方法动态地编写表达式。这是适合您情况的自定义扩展方法:public static partial class QueryableExtensions{ public static IQueryable<T> WhereEquals<T>(this IQueryable<T> source, string memberPath, string value) { var parameter = Expression.Parameter(typeof(T), "e"); var left = memberPath.Split('.').Aggregate((Expression)parameter, Expression.PropertyOrField); var right = Expression.Constant(ToType(value, left.Type), left.Type); var predicate = Expression.Lambda<Func<T, bool>>(Expression.Equal(left, right), parameter); return source.Where(predicate); } private static object ToType(string value, Type type) { if (type == typeof(string)) return value; if (string.IsNullOrEmpty(value)) return null; return Convert.ChangeType(value, Nullable.GetUnderlyingType(type) ?? type); }}除了使用Expression.Equal(相当于==运算符)外,还必须处理string到实际值类型的转换,顺便说一句,这是您原始异常的原因。用法是这样的:var dWRWorkItem = _context.TDwrWrkItm.AsQueryable();var q = HttpContext.Request.Query;foreach (string p in q.Keys) dWRWorkItem = dWRWorkItem.WhereEquals(p, q[p]);return dWRWorkItem.ToList(); (adsbygoogle = window.adsbygoogle || []).push({});
09-11 23:46