Problema di enumerazione IQueryable non generico
-
05-07-2019 - |
Domanda
Utilizzo di linq dinamico ( http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library .aspx ) Eseguo la query di seguito che restituisce un IQueryable. Su questo risultato che è anche un IEnumerable sono in grado di eseguire un Count () ma non c'è ToList () per ottenere i valori. Posso elencarli su di loro usando un foreach ma non sono in grado di accedere ai singoli campi nel tipo anonimo risultante senza riflessione. È questo l'unico modo? Grazie
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);
}
}
Ho provato a trasmettere ma ho ricevuto un errore Impossibile eseguire il cast dell'oggetto di tipo 'DynamicClass1' per digitare '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; }
}
Soluzione
Non puoi aspettarti che il tipo di oggetto dinamico venga risolto al momento della compilazione quando la query viene risolta in fase di esecuzione. Questo è il linq dinamico: ti consente di eseguire query dinamiche al controllo del tempo di compilazione dei costi.
Devi usare la riflessione per accedere alle proprietà di un tipo dinamico, almeno fino a C # 4.
Altri suggerimenti
Se IEnumerable non è generico, è necessario eseguire il cast anziché utilizzare la riflessione.