C #: Как ссылаться на свойства динамического объекта в запросе EF .Where () или Select ()? - PullRequest
1 голос
/ 06 июля 2019

Я хочу вернуть отфильтрованный список из DBContext Entity Framework-Core, основанный на нескольких значениях запроса, отправленных в .NET Core 2.2 Web API.

Метод API сопоставляет [FromBody] с экземпляром QueryObj.

Класс QueryObj имеет около 30 свойств (в основном, но не все строки).Это подмножество searachable для свойств в более крупном объекте (например: «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()

Есть идеи для лучшего подхода?

...