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

}

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top