Entity Framework che colpisce il limite di parametri 2100

entity-framework expression-trees linq parameters sql

Domanda

Sto migrando parte del nostro codice da LINQ a SQL a Entity Framework. In precedenza, quando si eseguiva un limite di 2100 parametri da SQL Server (descritto qui ), ho utilizzato la soluzione fornita da Marc Gravell qui . Come affermato nella sua risposta, non funziona con Entity Framework.

Sono completamente troppo inesperto con le espressioni per sapere da dove cominciare, ma quello che sto cercando è essenzialmente lo stesso metodo di estensione ma applicabile a Entity Framework. Grazie in anticipo per qualsiasi aiuto tu possa fornire.

Risposta accettata

Il problema del limite di parametro 2100 non esiste in EF.

Ho eseguito un test sul database AdventureWorks (in SQL Express 2008 R2): sto cercando di ottenere tutti i prodotti in cui ProductCategoryId trova nell'intervallo di valori (1, 2, 3).

Usando LINQ, la clausola SQL WHERE generata assomiglia a questa:

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]

(che porta al problema del numero massimo di parametri), mentre con EF 4.0 appare come questo:

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

Successivamente, ho provato questo con EF per un elenco di 3000 valori:

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

Mentre questo è estremamente inefficiente, funziona e produce il risultato atteso.

Tuttavia, è anche possibile utilizzare l'estensione InRange fornita da Marc Gravell con EF, utilizzando anche la libreria LINQKit , in questo modo:

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

(l'estensione AsExpandable è definita in LINQKit)

Questo produce il risultato atteso (esegue la query in blocchi) e, a seconda del numero di elementi nell'elenco e della dimensione del blocco, può essere molto più efficiente rispetto alla soluzione non Chunked.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché