Tengo una clase de acceso a datos que me tomó un tiempo para ponerme a trabajar. Para mi aplicación, necesito obtener diferentes tipos de tablas de SQL Server donde la cláusula WHERE solo difiere por el nombre de la columna: algunas columnas son read_time, otras son ReadTime y otras son LastModifiedTime. Así que pensé en pasar la cláusula WHERE, así que no tuve que crear un nuevo método para 50 tablas diferentes. Parece simple, y funciona, pero no entiendo nada.¿Por qué son Func <> y Expresión <Func<>> Intercambiables? ¿Por qué uno trabaja en mi caso?
Este método, con la expresión <> como parámetro, funciona:
internal List<T> GetObjectsGreaterThanReadTime<T>(Expression<Func<T, bool>> whereClause) where T : class
{
Table<T> table = this.Database.GetTable<T>();
IEnumerable<T> objects = table.Where(whereClause);
return objects.ToList();
}
Ahora, yo estaba tratando de esta manera (abajo) durante un tiempo, y sería simplemente pasar el rato en la última línea (ToList()). Primero, ¿por qué compilaría esto? Quiero decir, ¿por qué Expression y Func se pueden usar indistintamente como un parámetro? Entonces, ¿por qué funciona Expression y la versión de Func simplemente se cuelga?
Nota: La única diferencia entre el método anterior y este es el parámetro del método (Expresión frente a Func).
internal List<T> GetObjectsGreaterThanReadTime<T>(Func<T, bool> whereClause) where T : class
{
Table<T> table = this.Database.GetTable<T>();
IEnumerable<T> objects = table.Where(whereClause);
return objects.ToList();
}
Esto, junto con la (s) respuesta (s) es en sí una muy buena respuesta a algunos de los "¿cuál es el sentido de un árbol de expresiones?" estilo de preguntas. +1 Q & A –