from f in CUSTOMERS
where depts.Contains(f.DEPT_ID)
select f.NAME
depts
è una lista (IEnumerable<int>
) di ID repartoColpire 2100 limite del parametro (SQL Server) quando si utilizza Contiene()
Questa query funziona bene fino a quando si passa un elenco di grandi dimensioni (ad esempio circa 3000 ids dept) .. poi ottengo questo errore:
The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Too many parameters were provided in this RPC request. The maximum is 2100.
ho cambiato la mia domanda a:
var dept_ids = string.Join(" ", depts.ToStringArray());
from f in CUSTOMERS
where dept_ids.IndexOf(Convert.ToString(f.DEPT_id)) != -1
select f.NAME
utilizzando IndexOf()
ha corretto l'errore ma ha rallentato la query. C'è un altro modo per risolvere questo? grazie mille.
Come su [in questo modo] (http://stackoverflow.com/questions/567963/linq-expression-to-return-property-value/568771#568771) (che fabbricazioni in pezzi gestibili).Le altre opzioni (non LINQ) includono CSV e una UDF "divisa" e parametri con valori di tabella (in SQL2008). –
Mark, puoi spiegare quale è la migliore alternativa a 'contain' se ho vari parametri che contano da 1 a 2000? So che questo crea un sacco di piani in db, ma sembra che l'uso di 'like '% %'' richiederà ancora più tempo di risorse db. Cosa dovrei usare? –
Il problema del limite di parametro 2100 non esiste in Entity Framework: http://stackoverflow.com/questions/8898564/entity-framework-hitting-2100-parameter-limit – nmit026