Problema no genérico de enumeración IQueryable
-
05-07-2019 - |
Pregunta
Uso de linq dinámico ( http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library .aspx ) Ejecuto la siguiente consulta que devuelve un IQueryable. En este resultado, que también es un IEnumerable, puedo ejecutar un Count (), sin embargo, no hay ToList () para obtener los valores. Puedo enumerar sobre ellos usando un foreach pero no puedo acceder a los campos individuales en el tipo anónimo resultante sin reflexión. ¿Es esta la única manera? Gracias
var query =
db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
OrderBy("CompanyName").
Select("New(CompanyName as Name, Phone)");
foreach (var item in query)
{
foreach (var prop in item.GetType().GetProperties())
{
Console.WriteLine(prop);
}
}
Se intentó realizar una conversión pero se obtuvo un error No se puede convertir el objeto de tipo 'DynamicClass1' para escribir 'Prueba'.
foreach (var item in query)
{
Console.WriteLine("{0}: {1}", ((Test)item).CompanyName, ((Test)item).Phone);
}
public class Test {
public string CompanyName { get; set; }
public string Phone { get; set; }
}
Solución
No puede esperar que el tipo de su objeto dinámico se resuelva en el momento de la compilación cuando su consulta se resuelve en el tiempo de ejecución. De eso se trata el linq dinámico: le permite ejecutar consultas dinámicas al costo de la verificación en tiempo de compilación.
Tienes que usar la reflexión para acceder a las propiedades de un tipo dinámico, al menos hasta C # 4.
Otros consejos
Si el IEnumerable no es genérico, deberías lanzar en lugar de usar la reflexión.