Entity Framework, превышающий предел 2100 параметров - PullRequest
7 голосов
/ 17 января 2012

Я перенесу часть нашего кода из LINQ-to-SQL в Entity Framework.Ранее, когда я столкнулся с ограничением 2100 параметров из SQL Server (описано здесь ), я использовал решение, предоставленное Марком Гравеллом здесь .Как указано в его собственном ответе, он не работает с Entity Framework.

Я слишком неопытен с выражениями, чтобы знать, с чего начать, но то, что я ищу, по сути тот же метод расширения, но применимыйк Entity Framework.Заранее благодарим за любую помощь, которую вы можете предоставить.

1 Ответ

15 голосов
/ 04 февраля 2012

В 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)

Это приводит к ожидаемому результату (выполняет запрос в чанках) и, в зависимости от количества элементов в списке и размера чанка, может быть намного более эффективным, чем решение без чанков.

...