No estoy seguro si esto es posible o si estoy expresando correctamente lo que estoy buscando, pero tengo la siguiente pieza de código en mi biblioteca repetidamente y me gustaría practicar DRY. Tengo un conjunto de tablas de SQL Server que estoy consultando en base a un simple campo de búsqueda proporcionado por el usuario como Google. Estoy usando LINQ para redactar la consulta final en función de lo que hay en la cadena de búsqueda. Estoy buscando una manera de utilizar los genéricos y aprobada en las funciones lambda para crear una rutina reutilizable de esto:Genérico predicado de consulta LINQ?
string[] arrayOfQueryTerms = getsTheArray();
var somequery = from q in dataContext.MyTable
select q;
if (arrayOfQueryTerms.Length == 1)
{
somequery = somequery.Where<MyTableEntity>(
e => e.FieldName.StartsWith(arrayOfQueryTerms[0]));
}
else
{
foreach(string queryTerm in arrayOfQueryTerms)
{
if (!String.IsNullOrEmpty(queryTerm))
{
somequery = somequery
.Where<MyTableEntity>(
e => e.FieldName.Contains(queryTerm));
}
}
}
Tenía la esperanza de crear un método genérico con la firma que se ve algo como:
private IQueryable<T> getQuery(
T MyTableEntity, string[] arrayOfQueryTerms, Func<T, bool> predicate)
Estoy usando la misma estrategia de búsqueda en todas mis tablas, por lo que lo único que realmente difiere del uso es MyTable & MyTableEntity buscado y FieldName buscado. ¿Esto tiene sentido? ¿Hay alguna manera con LINQ para pasar dinámicamente el nombre del campo para consultar en la cláusula where? ¿O puedo pasar esto como un predicado lambda?
e => e.FieldName.Contains(queryTerm)
que se dan cuenta de que hay maneras de un millón y medio de hacer esto en SQL, probablemente más fácil, pero me encantaría para mantener todo en la familia LINQ para éste. Además, creo que los genéricos deberían ser útiles para un problema como este. ¿Algunas ideas?
La misma pregunta que para la cláusula Select: http://stackoverflow.com/questions/10376947/how-can-i-construct-and-save-to-a-db-for-later-use-a-semi- arbitrario-lambda-expre –