В EF проблема ограничения параметров 2100 не существует.
Я провел тест на базе данных AdventureWorks (в SQL Express 2008 R2): я пытаюсь получить все продукты, где ProductCategoryId
находится в диапазоне значений (1, 2, 3).
При использовании LINQ сгенерированное предложение SQL WHERE
выглядит следующим образом:
WHERE [t0].[ProductCategoryID] IN (@p0, @p1, @p2)
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [1]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [2]
-- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [3]
(что приводит к проблеме максимального числа параметров), тогда как в EF 4.0 это выглядит так:
WHERE [Extent1].[ProductCategoryID] IN (1,2,3)
Далее я проверил это с EF для списка из 3000 значений:
var categoryList = Enumerable.Range(1, 3000).Select(i => (int?)i).ToArray();
using (var aw = new AdventureWorksEntities())
{
var products = aw.Products
.Where(p => categoryList.Contains(p.ProductCategoryID))
.ToList();
}
Хотя это крайне неэффективно, оно работает и дает ожидаемый результат.
Однако также возможно использовать расширение InRange
, предоставленное Марком Гравеллом с EF, также используя библиотеку LINQKit , например:
using (var aw = new AdventureWorksEntities())
{
var products = aw.Products
.AsExpandable()
.InRange(p => p.ProductCategoryID, 1000, categoryList)
.ToList();
}
(расширение AsExpandable
определено в LINQKit)
Это приводит к ожидаемому результату (выполняет запрос в чанках) и, в зависимости от количества элементов в списке и размера чанка, может быть намного более эффективным, чем решение без чанков.