El método no se puede traducir a una expresión de almacén


Vi este código trabajar con LINQ a SQL, pero cuando uso Entity Framework, arroja este error:

LINQ to Entities no reconoce el Sistema del método.Linq.IQueryable ' 1 [Mi proyecto.Modelo.CommunityFeatures] GetCommunityFeatures()' método, y este método no se puede traducir a una expresión store.`

El código del repositorio es el 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.

¿Podría alguien explicar por qué este error ¿ocurre?

Author: abatishchev, 2010-10-02

1 answers

Razón: Por diseño, LINQ a Entidades requiere que toda la expresión de consulta LINQ se traduzca a una consulta del 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 traducir la consulta. Las invocaciones arbitrarias de métodos que no tienen una traducción conocida, como GetHomeFeatures() en este caso, no son soportadas.
Para ser más específico, solo LINQ to Entities apoyo constructores sin parámetros y Inicializadores.

Solución: Por lo tanto, para superar esta excepción necesita fusionar su sub consulta en la principal para GetCommunityFeatures() y GetHomeFeatures() en lugar de invocar métodos directamente desde la consulta LINQ. Además, hay un problema en las líneas que estaba tratando de instanciar una nueva instancia de LazyList usando sus constructores parametrizados, tal como podría haber hecho estado haciendo en LINQ a SQL . Para eso la solución sería cambiar a la evaluación de cliente de consultas LINQ (LINQ to Objects). Esto requerirá que invoque el AsEnumerable método para las 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: Por favor, echa un vistazo a LINQ to Entities, ¿qué no es compatible? para más información. También echa un vistazo LINQ to Entities, Soluciones alternativas sobre lo que no es compatible para una discusión detallada sobre las posibles soluciones. (Ambos enlaces son las versiones en caché porque el sitio web original está caído)

 105
Author: Morteza Manavi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-09 23:39:59