Não genérico IQueryable enumeração Problem
-
05-07-2019 - |
Pergunta
Usando o LINQ dinâmica ( http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library aspx ) eu executar a consulta a seguir que retorna um IQueryable. Nesta resultado que também é um IEnumerable eu sou capaz de executar um Count () no entanto não há ToList () para obter os valores. Posso enumerar sobre eles usando um foreach, mas não sou capaz de acessar os campos individuais no tipo anônimo resultante sem reflexão. É este o único caminho? Graças
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);
}
}
fundição Tentei, mas tenho um erro Impossível objeto fundido do tipo 'DynamicClass1' para digitar 'Test'.
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; }
}
Solução
Você não pode esperar o tipo de você objeto dinâmico para ser resolvido em tempo de compilação quando sua consulta é resolvido em tempo de execução. Isso é o que linq dinâmica é tudo sobre:. Permite-lhe executar consultas dinâmicas na verificação de custo em tempo de compilação
Você tem que usar a reflexão para acessar propriedades de um tipo dinâmico, pelo menos até C # 4.
Outras dicas
Se o IEnumerable não é genérico, então você deve lançar, em vez de usar a reflexão.