Il metodo non può essere tradotto in un’espressione di negozio

Ho visto questo codice funzionare con LINQ su SQL ma quando utilizzo Entity Framework, genera questo errore:

LINQ to Entities non riconosce il metodo ‘System.Linq.IQueryable’1 [MyProject.Models.CommunityFeatures] Metodo GetCommunityFeatures ()’ e questo metodo non può essere tradotto in un’espressione di archivio.

Il codice del repository è questo:

public IQueryable GetEstates() { return from e in entity.Estates let AllCommFeat = GetCommunityFeatures() let AllHomeFeat = GetHomeFeatures() select new Models.Estate { EstateId = e.EstateId, AllHomeFeatures = new LazyList(AllHomeFeat), AllCommunityFeatures = new LazyList(AllCommFeat) }; } public IQueryable GetCommunityFeatures() { return from f in entity.CommunityFeatures select new CommunityFeatures { Name = f.CommunityFeature1, CommunityFeatureId = f.CommunityFeatureId }; } public IQueryable GetHomeFeatures() { return from f in entity.HomeFeatures select new HomeFeatures() { Name = f.HomeFeature1, HomeFeatureId = f.HomeFeatureId }; } 

LazyList è una lista che estende la potenza di IQueryable.

Qualcuno potrebbe spiegare perché si verifica questo errore?

Motivo: in base alla progettazione, LINQ to Entities richiede che l’intera espressione della query LINQ venga tradotta in una query del server. Solo alcune sottoespressioni non correlate (espressioni nella query che non dipendono dai risultati del server) vengono valutate sul client prima che la query venga tradotta. Le invocazioni di metodi arbitrari che non hanno una traduzione conosciuta, come GetHomeFeatures () in questo caso, non sono supportate.
Per essere più specifici, LINQ alle quadro supportano solo costruttori e inizializzatori senza parametri .

Soluzione: Pertanto, per superare questa eccezione, è necessario unire la query secondaria a quella principale per GetCommunityFeatures () e GetHomeFeatures () anziché richiamare direttamente i metodi dalla query LINQ. Inoltre, c’è un problema sulle linee che stavi cercando di istanziare una nuova istanza di LazyList usando i suoi costruttori parametrizzati, proprio come avresti potuto fare in LINQ a SQL . Per questo la soluzione sarebbe passare alla valutazione del client delle query LINQ (LINQ to Objects). Ciò richiederà di richiamare il metodo AsEnumerable per le query LINQ alle quadro prima di chiamare il costruttore LazyList.

Qualcosa di simile dovrebbe funzionare:

 public IQueryable GetEstates() { return from e in entity.Estates.AsEnumerable() let AllCommFeat = from f in entity.CommunityFeatures select new CommunityFeatures { Name = f.CommunityFeature1, CommunityFeatureId = f.CommunityFeatureId }, let AllHomeFeat = from f in entity.HomeFeatures select new HomeFeatures() { Name = f.HomeFeature1, HomeFeatureId = f.HomeFeatureId }, select new Models.Estate { EstateId = e.EstateId, AllHomeFeatures = new LazyList(AllHomeFeat), AllCommunityFeatures = new LazyList(AllCommFeat) }; } 

Ulteriori informazioni: Si prega di dare un’occhiata a LINQ alle entity framework, cosa non è supportato? per maggiori informazioni. Controlla anche LINQ su entity framework, soluzioni alternative su ciò che non è supportato per una discussione dettagliata sulle possibili soluzioni. (Entrambi i link sono le versioni memorizzate nella cache perché il sito Web originale è inattivo)