Acabo de cambiar de Linq 2 SQL a Entity Framework, y estoy viendo comportamientos extraños en EF con los que espero que alguien pueda ayudar. Intenté buscar en Google, pero no pude encontrar otras personas con este mismo problema. Me he burlado de un escenario para explicar la situación.Entity Framework y Repository Pattern (problema con IQueryable)
Si trabajo directamente con un contexto EF, puedo hacer una selección dentro de una selección. Por ejemplo, esto se ejecuta perfectamente bien:
// this is an Entity Framework context that inherits from ObjectContext
var dc = new MyContext();
var companies1 = (from c in dc.Companies
select new {
Company = c,
UserCount = (from u in dc.CompanyUsers
where u.CompanyId == c.Id
select u).Count()
}).ToList();
Sin embargo, si uso un patrón repositorio en el repositorio está volviendo IQueryable (o incluso ObjectSet o ObjectQuery), aparece un NotSupportedException (LINQ a Entidades no reconoce el método 'System.Linq.IQueryable`1) ...
Aquí está un ejemplo de mi repositorio:
public class Repository {
private MyContext _dc;
public Repository() {
_dc = new MyContext();
}
public IQueryable<Company> GetCompanies() {
return _dc.Companies;
}
public IQueryable<CompanyUser> GetCompanyUsers() {
return _dc.CompanyUsers;
}
}
// estoy usando el repositorio dentro de otra clase (por ejemplo, en mi capa de Servicios)
var repository = new Repository();
var companies2 = (from c in repository.GetCompanies()
select new {
Company = c,
UserCount = (from u in repository.GetCompanyUsers()
where u.CompanyId == c.Id
select u).Count()
}).ToList();
El código anterior arroja una NotSupportedException.
que se dan cuenta de que si hay una asociación entre las empresas y CompanyUsers, entonces puedo simplemente hacer esto y no tendrán ningún problema:
var companies3 = (from c in repository.GetCompanies()
select new {
Company = c,
UserCount = (from u in c.CompanyUsers
select u).Count()
}).ToList();
... pero mi ejemplo es sólo una versión simplificada de una más complicada escenario donde no tengo una asociación entre las entidades.
Así que estoy muy confundido por qué Entity Framework está lanzando la excepción NotSupportedException. ¿Cómo es que la consulta funciona perfectamente bien cuando estoy trabajando con el contexto EF directamente, pero no es compatible si estoy trabajando con IQueryable devuelto por otro método. Esto funcionó perfectamente bien con Linq 2 SQL, pero no parece funcionar en Entity Framework.
Cualquier observación sería muy apreciada.
Gracias de antemano.
¿Por qué necesitamos hacer eso, quiero decir que tenemos asociación aquí? – paragy
+1 U también lo contestó ... – paragy
Esto requiere dos viajes redondos al servidor ... espera, ¿o sí? –