C#:如何在EF .Where()或Select()查询中引用动态对象属性?

时间:2019-07-05 23:41:46

标签: c# .net-core entity-framework-core

我想基于POST到.NET Core 2.2 Web API的多个查询值,从Entity Framework-Core DBContext返回过滤的列表。

API方法将[FromBody]映射到QueryObj实例。

QueryObj类具有大约30个属性(大多数但不是全部字符串)。这些是较大实体中属性的“可搜索”子集(例如:“ lastName”,“ serialNumber”,“ customerID”,“ purchaseDate”等)。

由于查询选项可能会发生变化,并且由于编写和维护起来比较笨拙,所以我不希望硬编码约30个比较,例如:

.Where(x => x.Prop1Name == query.Prop1Name && ... x.Prop30Name == query.Prop30Name);

但是我不知道如何在循环内动态引用属性... 或者,甚至需要循环,还是比较理想。也许不是吗?我不知道什么是“惯用的” .NET Core筛选方法,因此,如果我完全偏离轨道,欢迎任何建议。

在JS中,我可能会做类似的事情:

return myDataSvc.filter(x => {
  for (prop in query){
    if(x[prop] == query[prop]){
       return true;
    } 
  }
}

(这可能是错误的,但是您知道了-非常简单...)

在C#中,用于引用对象属性的方括号符号似乎不存在,或者至少我尝试过的内容不起作用。

我发现的唯一答案是像这样的内省:

x.GetType().GetProperty(prop.ToString()).GetValue() == 
query.GetType().GetProperty(prop.ToString()).GetValue()

有更好的方法吗?

0 个答案:

没有答案