#c# #linq #collections #filtering
#c# #linq #Коллекции #фильтрация
Вопрос:
Я просмотрел множество примеров того, как фильтровать коллекцию на основе другой коллекции, и я нашел простой способ, например:
var oShipnotes = await DbContext.ShipNotes.Where(s => oManageRouteDto.ShipNotes.Any(mr => mr.Id == s.Id)).ToListAsync();
однако он выдает исключение, в котором говорится, что оно не может быть преобразовано в SQL-запрос.
Может ли кто-нибудь указать мне правильное направление, как это решить? Спасибо!
Комментарии:
1. Можете ли вы показать полное сообщение об исключении?
2. Какая версия Net / Core? Не все сетевые запросы будут работать с Core.
Ответ №1:
Замените вложенный запрос LINQ на материализованный список идентификаторов:
// 1) get the list of target ship note identifiers
var ids = oManageRouteDto.ShipNotes.Select(mr => mr.Id).ToList();
// 2) pass this list into Where using Contains
var oShipnotes = await DbContext.ShipNotes.Where(s => ids.Contains(s.Id)).ToListAsync();
EF знает об этом шаблоне и преобразует IList<T>.Contains
в IN
условие SQL.
Поскольку EF имеет дело с IQueryable
s, каждый запрос LINQ должен быть преобразован в допустимое выражение SQL. В результате EF и базовый поставщик не могут перевести каждый допустимый запрос LINQ (с точки зрения C #) только потому, что SQL не является C #.
Комментарии:
1. Спасибо @Dennis за быстрый ответ, работает как шарм!