Entity Framework Hitting 2100 Parameter Limit

entity-framework expression-trees linq parameters sql

Question

Je migre une partie de notre code de LINQ-to-SQL vers Entity Framework. Auparavant, lorsque j'étais confronté à une limite de 2100 paramètres de SQL Server (décrite ici ), j'utilisais la solution fournie par Marc Gravell ici . Comme indiqué dans sa propre réponse, cela ne fonctionne pas avec Entity Framework.

Je suis totalement trop inexpérimenté avec Expressions pour savoir par où commencer, mais ce que je recherche, c'est essentiellement la même méthode d'extension, mais applicable à Entity Framework. Merci d'avance pour toute aide que vous pouvez fournir.

Réponse acceptée

Le problème de limite de paramètre 2100 n'existe pas dans EF.

J'ai effectué un test sur la base de données AdventureWorks (dans SQL Express 2008 R2): j'essaie d'obtenir tous les produits pour lesquels ProductCategoryId est dans la plage de valeurs (1, 2, 3).

À l'aide de LINQ, la clause SQL WHERE générée ressemble à ceci:

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]

(ce qui conduit au problème du nombre maximal de paramètres), alors qu'avec EF 4.0 cela ressemble à ceci:

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]

Ensuite, j'ai testé cela avec EF pour une liste de 3000 valeurs:

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]

Bien que cela soit extrêmement inefficace, cela fonctionne et donne le résultat attendu.

Cependant, il est également possible d'utiliser l'extension InRange fournie par Marc Gravell avec EF, en utilisant également la bibliothèque LINQKit , comme ceci:

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]

(l'extension AsExpandable est définie dans LINQKit)

Cela produit le résultat attendu (exécute la requête en morceaux) et, en fonction du nombre d'éléments de la liste et de la taille du morceau, il peut s'avérer beaucoup plus efficace que la solution sans morceaux.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi