Estoy en el proceso de acelerar las consultas de SQL en una aplicación web mediante la conversión a consultas compiladas y me encontré con un problema al convertir una declaración muy simple.Consulta compilada de Linq usando Contiene (como la instrucción IN de SQL)
quiero compilar una declaración simple que utiliza los siguientes parámetros para obtener empleados válidos a partir de la base de datos:
TestParams myParams = new TestParams
{
ValidEmps = new int[] { 1, 2, 3 }
};
Ésta es la consulta de trabajo:
IQueryable<Employees> MySelectedEmps =
from emps in db.Employees
where myParams.ValidEmps.Contains(emps.EmployeeID)
select emps;
Aquí está mi intento de compilar esto:
private static Func<MyDataContext, TestParams, IQueryable<Employee>> myCompiledQuery =
CompiledQuery.Compile((MyDataContext db, TestParams myParams) =>
from emps in db.Employees
where myParams.ValidEmps.Contains(emps.EmployeeID)
select emps);
Esta declaración con compilación y compilación, pero cuando lo ejecuto, Recibo el siguiente error de tiempo de ejecución:
Comparison operators not supported for type 'System.Int32[]'
También he intentado hacer pasar una lista y un IEnumerable con el mismo mensaje de error.
También he intentado reemplazar la instrucción .Contains con una declaración .Any (valemp => valemp == emps.EmployeeID) pero sigo recibiendo el mismo error.
¿Es posible tener una consulta compilada que use el equivalente de la instrucción SQL "IN"? ¿Qué estoy haciendo mal?
http://stackoverflow.com/questions/813256/compiled-queries-and-parameters-cannot-be-sequences –
Gracias por el enlace. Es una noticia decepcionante, no creo que nadie tenga una solución factible. –
intente con un procedimiento almacenado como sugiero a continuación ... –