Entity Framework Hitting 2100 Parameter Limit

entity-framework expression-trees linq parameters sql

Frage

Ich migriere einen Teil unseres Codes von LINQ-to-SQL nach Entity Framework. Früher, als gegen ein 2100 Parameter Limit von SQL Server lief bis (beschrieben hier ), habe ich die Lösung von Marc GRA versehen hier . Wie in seiner eigenen Antwort erwähnt, funktioniert es nicht mit Entity Framework.

Ich bin mit den Expressions völlig zu unerfahren, um zu wissen, wo ich anfangen soll, aber was ich suche, ist im Wesentlichen die gleiche Erweiterungsmethode, aber anwendbar auf Entity Framework. Vielen Dank im Voraus für Ihre Hilfe.

Akzeptierte Antwort

Das 2100-Parameter-Limit-Problem existiert nicht in EF.

Ich habe einen Test für die AdventureWorks-Datenbank (in SQL Express 2008 R2) ausgeführt: Ich versuche, alle Produkte zu erhalten, bei denen ProductCategoryId im Wertebereich liegt (1, 2, 3).

Mit LINQ sieht die generierte SQL WHERE Klausel folgendermaßen aus:

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]

(was zu dem Problem der maximalen Parameteranzahl führt), während es mit EF 4.0 so aussieht:

WHERE [Extent1].[ProductCategoryID] IN (1,2,3)

Als nächstes habe ich dies mit EF für eine Liste von 3000 Werten getestet:

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();
}

Obwohl dies äußerst ineffizient ist, funktioniert es und liefert das erwartete Ergebnis.

Es ist jedoch auch möglich, die InRange Erweiterung von Marc Gravell mit EF zu verwenden, indem Sie die LINQKit-Bibliothek wie folgt verwenden :

using (var aw = new AdventureWorksEntities())
{
    var products = aw.Products
        .AsExpandable()
        .InRange(p => p.ProductCategoryID, 1000, categoryList)
        .ToList();
}

(Die AsExpandable Erweiterung ist in LINQKit definiert)

Dies erzeugt das erwartete Ergebnis (führt die Abfrage in Blöcken aus) und kann abhängig von der Anzahl der Elemente in der Liste und der Größe des Blocks viel effizienter sein als die nicht-chunked Lösung.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum