C # — фильтрация коллекции на основе другого исключения коллекции

#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 за быстрый ответ, работает как шарм!