Utilizzo di Include in Entity Framework 4 con espressioni lambda


88

Ho visto molti articoli su come superare questa questione, tutti relativi a CTP4, o aggiungendo i miei metodi di estensione.

Esiste un modo "ufficiale" EF4 incluso per utilizzare le espressioni lambda all'interno di include (sia per le relazioni di primo livello che per il 2 ° e più livello) o alla fine non è stato incluso nell'RTM?

Ce n'è uno - sarei felice di imparare come farlo, poiché l'uso dell'espressione lambda nel mio codice ora (con # system.data.entity # system.data.linq) mi dà ancora:

Impossibile convertire l'espressione lambda nel tipo "stringa" perché non è un tipo delegato su:

var customers = from c in
context.Customers.Include(c=>c.Phone)

1
no, non esiste (a parte CTP4 - come dici tu). Uso metodi di estensione / enumerazioni per ottenere l'indipendenza dai tipi.
RPM1984

L'ho fatto anche io, quindi MS lo ha incluso su CTP4 e lo ha rimosso in RTM?
Dani

Risposte:


229

La versione RTM di Entity Framework 4.1 include effettivamente metodi di estensione nel EntityFramework.dllfile, per un caricamento desideroso con lambda tramite la Includefunzione. Includi semplicemente la DLL nel tuo progetto e dovresti essere in grado di scrivere codice come:

var princesses1 = context.Princesses.Include(p => p.Unicorns).ToList();

Ricordarsi di aggiungere un'istruzione Import / Using per includere lo spazio dei nomi System.Data.Entity . In caso contrario, il compilatore non riesce a trovare i metodi di estensione. Per esempio:

using System.Data.Entity;

Per ulteriori informazioni, vedere questo articolo del blog del team di ADO.NET .


1
Sebbene il collegamento al blog ADO.net sia ancora pertinente, la guida / riferimento EF6 per lo stesso argomento è: Caricamento di entità correlate Penso che la documentazione debba passare agli esempi di Princess e Unicorn invece del blog e del post che hanno utilizzato ovunque.
Arkaine55

1
grazie, aggiungo solo using System.Data.Entity; il suo lavoro me.
adnan

il link al blog del team è morto, questa è la nuova posizione
Nintynuts

89

Sebbene questo sia implicito nella domanda, per chiunque abbia lo stesso problema in cui non possono usare lambda con .Include, assicurati di avere questo:

using System.Data.Entity;

5

No, al momento non è disponibile il supporto ufficiale per Includi con espressione lambda in RTM. Sto usando questo .

Quando parliamo di CTP4, intendiamo Entity Framework Feature. È un'API più recente di EF4. Include principalmente Code First e pochi altri miglioramenti.


Qualche idea su quando MS supporterà questa funzione? Capisco che tutti questi metodi di estensione hanno un problema di prestazioni con oggetti di grandi dimensioni / multilivello - poiché devono attraversare ancora e ancora ogni chiamata per include, e mentre l'albero di "definizione" dell'oggetto è costante e può essere memorizzato nella cache, non esiste una soluzione come questo ancora.
Dani

La funzionalità di Entity Framework è attualmente in CTP5. Immagino che la versione RTM dovrebbe essere pubblicata nel primo trimestre del 2011. Quindi spero che conterrà Include con espressione lambda ma non ho ancora verificato la sua implementazione, quindi non posso dire se utilizza alcun tipo di cache.
Ladislav Mrnka

31
Questa risposta è sbagliata a partire da EF 4.3.x. Le altre risposte sono corrette, è necessario utilizzare System.Data.Entity per ottenere l'overload con le espressioni lamda.
Eric J.

1
@EricJ: Sì. L'inclusione fortemente tipizzata è disponibile a partire da EF 4.1.
Ladislav Mrnka
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.