#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 и проверю выражение отладки моего запроса, оно покажет некоторую аннотацию уровня класса в запросе, которая не будет разрешена во время окончательного выполнения и выдаст ошибку. Итак, я хочу создать простой запрос, который я опубликовал в своем исходном сообщении