O método não pode ser traduzido em uma expressão de loja

Eu vi esse código trabalhar com LINQ to SQL, mas quando eu uso o Entity Framework, ele lança este erro:

O LINQ to Entities não reconhece o método ‘System.Linq.IQueryable’1 [MyProject.Models.CommunityFeatures] GetCommunityFeatures ()’ e esse método não pode ser convertido em uma expressão de armazenamento.

O código do repository é este:

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 é uma lista que amplia o poder do IQueryable.

Alguém poderia explicar por que esse erro ocorre?

Razão: Por design, o LINQ to Entities requer que toda a expressão de consulta LINQ seja convertida em uma consulta de servidor. Apenas algumas subexpressões não correlacionadas (expressões na consulta que não dependem dos resultados do servidor) são avaliadas no cliente antes de a consulta ser traduzida. Invocações de método arbitrário que não possuem uma tradução conhecida, como GetHomeFeatures () neste caso, não são suportadas.
Para ser mais específico, o LINQ to Entities suporta apenas construtores e inicializadores sem parâmetros .

Solução: Portanto, para superar essa exceção, você precisa mesclar sua subconsulta na principal para GetCommunityFeatures () e GetHomeFeatures () em vez de chamar diretamente os methods da consulta LINQ. Além disso, há um problema nas linhas em que você estava tentando instanciar uma nova instância de LazyList usando seus construtores com parâmetros, assim como você poderia estar fazendo no LINQ to SQL . Para isso, a solução seria alternar para avaliação de cliente de consultas LINQ (LINQ to Objects). Isso exigirá que você invoque o método AsEnumerable para suas consultas LINQ to Entities antes de chamar o construtor LazyList.

Algo como isso deve funcionar:

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

Mais informações: Por favor, dê uma olhada no LINQ to Entities, o que não é suportado? para mais informações. Verifique também o LINQ to Entities, Soluções alternativas sobre o que não é suportado para uma discussão detalhada sobre as possíveis soluções. (Ambos os links são versões em cache porque o site original está inativo)