2010-08-20 14 views
6

Cuando intento llamar a mi repositorio en un Sub Select, obtengo este error.LINQ to Entities no reconoce el método 'System.Linq.IQueryable

IGrpTextRepository rep = new GrpTextRepository(); 

     var query = new DetailViewModel 
     { 
      ViewDet = (from gh in _db.Grp 
         select new MultiDetailViewModel 
         { 
          Header = gh, 
          Txts = rep.FindAllLangTxtById(gh.GrpID) 

         }).ToList(), 
      Lang = _db.Language.ToList(), 

     }; 

mi interfaz es

public interface IGrpTextRepository 
{ 
    IQueryable<GrpText> FindAllLangTxtById(int GrpID); 
} 

public class GrpTextRepository : IGrpTextRepository 
{ 
    DBEntities db = new DBEntities(); 

    public IQueryable<GrpText> FindAllLangTxtById(int GrpID) 
    { 
     return (from lang in db.Language 
       join gtxts in db.GrpText on lang.LangID equals gtxts.LangID into jointxt 
       from fintxt in jointxt.DefaultIfEmpty() 
       where fintxt.GrpID == GrpID 
       select fintxt); 
    } 


} 

Aquí está el mensaje de error completo
System.NotSupportedException: LINQ a Entidades no reconoce el método 'System.Linq.IQueryable`1 [aaa.Models .GrpText] Método FindAllLangTxtById (Int32) ', y este método no se puede traducir a una expresión de tienda.

+0

Desearía poder explicar esto sucintamente ... ¿Cuánto sabe usted ya sobre la interfaz IQueryable, la ejecución diferida y los árboles de expresiones? – jfar

Respuesta

13

La solución simple es agregar un .ToList() antes de su selección (...).

ViewDet = _db.Grp.ToList().Select(gh => new MultiDetailViewModel ...) 

De esa manera la petición inicial irá a la base de datos, vuelve con los resultados y, a continuación, puede reproyectar ellos mediante una instrucción SELECT en LINQ a objetos.

Pero tengo que preguntar por qué no hay una relación FK entre los grupos y los textos y por lo tanto una Asociación de Entidades entre los dos que le permite acceder a gh.GrpText y acceder a la colección de textos cargados con pereza (o cargados con entusiasmo usando .Include()).

Como señala @Doguhan Uluca en los comentarios, utilizar ToList() es arriesgado, ya que hará que todo lo que se encuentra en esa tabla se cargue en la memoria. Solo debe usarlo en colecciones muy pequeñas. El enfoque correcto es arreglar el diseño de su base de datos para que pueda consultarlo de manera eficiente.

+0

Ya tengo un FK entre grupo y texto. . Quiero hacer una subconsulta con una combinación de la izquierda con mi Tabla de idiomas. Quiero la lista de cada texto de grupo en idioma diferente. Si el texto del grupo no es traductivo para un idioma específico, quiero que el resultado sea nulo. –

+7

Aconsejo no llamar a .ToList() en la tabla de la base de datos, a menos que desee cargar toda la tabla en la memoria. –

+0

@DoguhanUluca - Entonces, ¿cuál es la alternativa a llamar .ToList() en una situación como esta? – oonyalo

Cuestiones relacionadas