Структура сущностей с динамическим значением, установленным в предложении where, не работает

#c# #entity-framework #.net-core

#c# #entity-framework #.net-ядро

Вопрос:

Моя база данных и соответствующая структура классов приведены ниже

 Class Helper:
   List<Util> UtilityInfo,
   
Class Util :
   int Id
 

У меня есть массив фильтров со значениями ниже

 int[] idArray = { 1, 2, 3};
 

Ожидаемый формат запроса:

  _dbContent.Helper.Where(hp => hp.utilityInfo.Any(ut => ut != null amp;amp; ut.Util.id = 1 || ut => ut.Util.id == 2 || ut => ut.Util.id == 3));
 

Я хочу добиться того же, выполнив цикл по массиву идентификаторов.

Когда я выполняю вышеуказанный запрос, он работает нормально, но я хочу создать такой же динамически, используя цикл.

Я пробовал использовать приведенный ниже шаблон, но он добавил некоторое выражение на уровне класса [ut.Util.id == item] , наблюдал то же самое внутри содержимого выражения отладки в Visual Studio.

Наконец, из-за чего возникает ошибка во время извлечения данных.

 var helperInfo = new List<Helper>()

foreach(var item in idArray)
{
    helperInfo = helperInfo.Where(hp => hp.utilityInfo.Any(ut => ut != null amp;amp; ut.Util.id == item));
}
 

Примечание: я успешно выполнил приведенное выше с приведенным ниже шаблоном, но хочу добиться того же с помощью цикла

 helper= helper.Where
(
  hp => idArray.Any
  (
     uId => hp.utilityInfo!= null amp;amp;
     v.utilityInfo.Any
     (
        ut => ut.User != null amp;amp;
        ut.Id == uId
     )
  )).ToList();
}
 

Ответ №1:

Вы просто можете использовать это

 int[] idarray = { 1, 3, 5 };
var list = context.Helpers.Include(x => x.Utilities.Where(y => idarray.Contains(y.Id))).ToList();
 

Результат

введите описание изображения здесь

Ответ №2:

Обновление 2

Вы можете повторить IQueryable ту же концепцию в предыдущем обновлении, как показано ниже, или использовать выражение

 var helperInfo = _dbContent.Helper;
var filteredHelperInfo = new List<Helper>();

foreach(var item in idArray)
{
   filteredHelperInfo.AddRange(helperInfo.Where(hp => hp.utilityInfo.Any(ut => ut != null amp;amp; ut.Util.id == item)).ToList());
}
 

Если я теперь хорошо понимаю, нужно ли запрашивать список помощников с помощью цикла, вам нужно создать новый список и добавлять в него отфильтрованные элементы на каждой итерации, как показано ниже

Примечание: в вашем коде на первой итерации ваш список будет отфильтрован по первому идентификатору, во второй раз вы не найдете никаких элементов в списке со вторым идентификатором, поэтому ваш список будет пустым

 var helperInfo = new List<Helper>();
var filteredHelperInfo = new List<Helper>();

foreach(var item in idArray)
{
   filteredHelperInfo.AddRange(helperInfo.Where(hp => hp.utilityInfo.Any(ut => ut != null amp;amp; ut.Util.id == item)));
}
 

Обновить

Если я теперь хорошо понимаю, нужно ли запрашивать список помощников с помощью цикла, вам нужно создать новый список и добавлять в него отфильтрованные элементы на каждой итерации, как показано ниже

Примечание: в вашем коде на первой итерации ваш список будет отфильтрован по первому идентификатору, во второй раз вы не найдете никаких элементов в списке со вторым идентификатором, поэтому ваш список будет пустым

 var helperInfo = new List<Helper>();
var filteredHelperInfo = new List<Helper>();

foreach(var item in idArray)
{
   filteredHelperInfo.AddRange(helperInfo.Where(hp => hp.utilityInfo.Any(ut => ut != null amp;amp; ut.Util.id == item)));
}
 

Старый ответ для минимального кода

Вы можете использовать contains вместо цикла, как показано ниже, это приведет к получению всех элементов с одинаковыми идентификаторами в указанном вами массиве

 helperInfo = helperInfo.Where(hp => hp.utilityInfo.Any(ut => ut != null amp;amp; idArray.Contains( ut.Util.id)));
 

Комментарии:

1. Спасибо за ответ ..! использование . ToList() Я могу получить ожидаемый результат. Но я хочу запустить запрос на IQueryable<Помощник> object.so Я хочу подготовить запрос как параметр «ExpectedFormat».

2. извините, не могу понять!! пожалуйста, уточните, что именно вам нужно, чтобы иметь возможность помочь

3. Поскольку я выполняю различные предложения where для основного объекта, и в конце я извлекаю данные из базы данных. Если я выполню тот же запрос и верну объект ToList(), который вернет ожидаемые данные. Но если я добавлю какие-либо другие предложения where и проверю выражение отладки моего запроса, оно покажет некоторую аннотацию уровня класса в запросе, которая не будет разрешена во время окончательного выполнения и выдаст ошибку. Итак, я хочу создать простой запрос, который я опубликовал в своем исходном сообщении