from f in CUSTOMERS
where depts.Contains(f.DEPT_ID)
select f.NAME
depts
es una lista (IEnumerable<int>
) de identificadores de departamentoGolpear el 2100 límite de parámetros (SQL Server) cuando se utiliza Contiene()
Esta consulta funciona bien hasta que pase una lista grande (es decir, aproximadamente 3000 identificadores de dept) .. entonces me sale este error:
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.
he cambiado de consulta 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
usando IndexOf()
corrigió el error pero ralentizó la consulta. ¿Hay alguna otra forma de resolver esto? muchas gracias.
¿Qué tal [como tal] (http://stackoverflow.com/questions/567963/linq-expression-to-return-property-value/568771#568771) (que se lotes en piezas manejables).Las otras opciones (que no son LINQ) implican CSV y una UDF "dividida" y parámetros de tabla-valor (en SQL2008). –
Marca, ¿puede explicar cuál es la mejor alternativa para 'contener' si tengo varios parámetros que cuentan desde 1 hasta 2000? Sé que esto crea un montón de planes en db, pero parece que el uso de 'like '%%'' tomará aún más tiempo de recursos db. ¿Qué debería usar? –
El problema del límite de 2100 parámetros no existe en Entity Framework: http://stackoverflow.com/questions/8898564/entity-framework-hitting-2100-parameter-limit – nmit026