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; }

}

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top