Вопрос по linq-to-sql – Обход LinqToSQls исключения «запросы с локальными коллекциями не поддерживаются»
Итак, я пытаюсь вернуть коллекцию людей, чей идентификатор содержится в локально созданной коллекции идентификаторов (IQueryable)
Когда я указываю «локально созданную коллекцию», я имею в виду, что коллекция Ids не пришла из запроса LinqToSql и была создана программно (на основе пользовательского ввода). Мой запрос выглядит так:
var qry = from p in DBContext.People
where Ids.Contains(p.ID)
select p.ID;
Это вызывает следующее исключение ...
& quot; запросы с локальными коллекциями не поддерживаются & quot;
Как я могу найти всех людей с идентификатором, который содержится в моей локальной коллекции идентификаторов?
Возможно ли использовать LinqToSql?
но ответы здесь не работают для меня, поскольку я делаю динамические типы в дальнейшем.
Что я сделал, так это использовал "UNION" в цикле, который прекрасно работает. Вот как:
var firstID = cityList.First().id;
var cities = dc.zs_Cities.Where(c => c.id == firstID);
foreach(var c in cityList)
{
var tempCity = c;
cities = cities.Union(dc.zs_Cities.Where(cty => cty.id == tempCity.id));
}
массивом или подобным, L2S преобразуется в содержимое.
Если Ids является IQueryable, просто включите его в список, прежде чем использовать его в запросе. Например.:
List<int> listOfIDs = IDs.ToList();
var query =
from st in dc.SomeTable
where listOfIDs.Contains(st.ID)
select .....
преобразование идентификаторов, имеющих тип IQueryable в List или Array, решит проблему, это будет преобразовано в «IN». Оператор в SQL. Но будьте осторожны, потому что, если число идентификаторов & gt; = 2100, это вызовет другую проблему, которая "Сервер поддерживает максимум 2100 параметров". и это максимальное количество параметров (значений), которое вы можете передать в «IN»; в SQL-сервере.
Другой альтернативой будет сохранение идентификаторов IQueryable и использование LINQ «Любой». оператор вместо «Содержит», это будет переведено как «СУЩЕСТВУЕТ» в SQL-сервере.