O método não pode ser traduzido para uma expressão de armazenamento

eu vi este código funcionar com o LINQ para o SQL, mas quando eu uso o Entity Framework, ele lança este erro:

o LINQ às Entidades não reconhece o sistema do método.Linq.IQueryable ' 1 [MyProject.Modelo.Este método não pode ser traduzido numa expressão de loja.`

o código do repositório é este:

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

public IQueryable<Models.CommunityFeatures> GetCommunityFeatures()
{
    return from f in entity.CommunityFeatures
           select new CommunityFeatures
                      {
                          Name = f.CommunityFeature1,
                          CommunityFeatureId = f.CommunityFeatureId
                      };
}

public IQueryable<Models.HomeFeatures> GetHomeFeatures()
{
    return from f in entity.HomeFeatures
           select new HomeFeatures()
           {
               Name = f.HomeFeature1,
               HomeFeatureId = f.HomeFeatureId
           };
}
O Lazilista é uma lista que estende o poder do IQueryable.

Alguém pode explicar porque é que este erro ocorre?

Author: abatishchev, 2010-10-02

1 answers

Razão: Por projecto, LINQ para entidades requer que toda a expressão da consulta LINQ seja traduzida para uma consulta do servidor. Apenas algumas sub-expressões não relacionadas (expressões na consulta que não dependem dos resultados do servidor) são avaliadas no cliente antes da Consulta ser traduzida. Invocações de métodos arbitrários que não têm uma tradução conhecida, como Getomefeatures() neste caso, não são suportadas.
Para ser mais específico, LINQ para entidades suporte apenas Construtores parametrizados e inicializadores .

Solução: Portanto, para ultrapassar esta excepção, terá de fundir a sua sub-pesquisa na principal para Getcomunityfeatures() e gethomefeatures() em vez de invocar directamente métodos de dentro da pesquisa LINQ. Além disso, há um problema nas linhas que você estava tentando instanciar uma nova instância de Lazilista usando seus construtores parametrizados, assim como você poderia têm sido feitos em LINQ para SQL . Para isso, a solução seria mudar para a avaliação do cliente de consultas LINQ (LINQ para objetos). Isto irá exigir que invoque o Asenumeráveis método para o seu LINQ para consultas de Entidades antes de chamar o construtor LazyList.

Algo assim deve funcionar.

public IQueryable<Models.Estate> 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<HomeFeatures>(AllHomeFeat),
            AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
       };
}


Mais Informações: por favor, dê uma olhada LINQ para Entidades, o que não é suportado? para mais informações. Confira também LINQ para entidades, trabalho sobre o que não é suportado para uma discussão detalhada sobre as possíveis soluções. (Ambos os links são as versões em cache porque o site original está em baixo)

 105
Author: Morteza Manavi, 2015-02-09 23:39:59