Tengo usuarios buscando registros de tipo Record. Teclean un término de búsqueda en un cuadro de texto y luego busco registros haciendo coincidir varios campos con el término de búsqueda.Cómo reutilizar cláusulas where en consultas de Linq a SQL
Mi consulta es así:
var results = from record in DataContext.Records
where
record.Field1.ToLower().Contains(term) ||
record.Field2.ToLower().Contains(term) ||
record.Field3.ToLower().Contains(term)
select record;
Tengo un número de consultas que todos utilizan el mismo filtro y por lo tanto me gustaría extraer el filtrado para que pueda ser reutilizado. Algo así como:
var filter = new Func<Record, string, bool>(
(record, term) =>
record.Field1.ToLower().Contains(term) ||
record.Field2.ToLower().Contains(term) ||
record.Field3.ToLower().Contains(term)
);
var results = from record in DataContext.Records
where filter(record, term)
select record;
Sin embargo, esto no funcionará porque:
Método 'System.Object DynamicInvoke (System.Object [])' no tiene traducción apoyado a SQL.
¿Cómo puedo volver a utilizar mi condición de estado en las consultas?
No creo que esto funcione como está escrito: CQ.Compile produce un Func por lo que no se puede usar en la cláusula Where de una consulta de LINQ a SQL. ¿No necesita algo como 'var query = CompiledQuery.Compile ((string term) => de r en DataContext.Records donde r.Field1.ToLower(). Contiene (term) select r);' then 'var results = query ("someTerm"); '? ¡No he usado CompiledQuery así que puedo estar equivocado! – itowlson
@itowlson: Funciona. Así es como crea funciones reutilizables utilizables en LINQ to SQL. El proveedor de consultas reconocerá la función compilada y generará la consulta según sea necesario. No solo genera consultas completas, sino que también podría generar partes de consultas (como este condicional). –
Esto funciona como se esperaba. Lo único extraño es que también reutilizo ese filtro en las consultas de Linq To Object, y aún tengo que pasar el Linq To Sql DataContext como parámetro. ¿Alguna forma de definir la consulta independientemente del DataContext? –