2010-10-02 9 views
68

vi este trabajo código con LINQ a SQL pero cuando se utiliza Entity Framework, que arroja este error:El método no puede traducirse en una expresión tienda

LINQ to Entities does not recognize the method 'System.Linq.IQueryable'1[MyProject.Models.CommunityFeatures] GetCommunityFeatures()' method, and this method cannot be translated into a store expression.`

El repositorio de código es la siguiente:

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

LazyList es una lista que extiende el poder de IQueryable.

¿Alguien podría explicar por qué ocurre este error?

Respuesta

96

Motivo: Por diseño, LINQ to Entities requiere que toda la expresión de consulta LINQ para ser traducido a una consulta de servidor. Solo unas pocas subexpresiones no correlacionadas (expresiones en la consulta que no dependen de los resultados del servidor) se evalúan en el cliente antes de que se traduzca la consulta. Las invocaciones de métodos arbitrarios que no tienen una traducción conocida, como GetHomeFeatures() en este caso, no son compatibles.
Para ser más específicos, LINQ to Entities solo admite Parameterless constructores y Inicializadores.

Solución: Por lo tanto, para superar esta excepción que necesita para fusionar su sub consulta en el principal para GetCommunityFeatures() y GetHomeFeatures() en lugar de invocar directamente los métodos de dentro de la consulta LINQ. Además, hay un problema en las líneas que intentaba crear una nueva instancia de LazyList usando sus constructores parametrizados, tal como lo ha estado haciendo en LINQ to SQL. Para eso, la solución sería cambiar a la evaluación del cliente de consultas LINQ (LINQ to Objects). Esto requerirá que invoque el método AsEnumerable para sus consultas de LINQ to Entities antes de llamar al constructor LazyList.

Algo como esto debería 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) 
     }; 
} 


Más información: favor, eche un vistazo a LINQ to Entities, what is not supported? para obtener más información. También consulte LINQ to Entities, Workarounds on what is not supported para una discusión detallada sobre las posibles soluciones. (Ambos enlaces son versiones en caché porque el sitio web original está caído)

Cuestiones relacionadas