Estrutura de entidade e padrão de repositório (problema com IQueryable)
Acabei de mudar do Linq 2 SQL para o Entity Framework e estou vendo alguns comportamentos estranhos no EF que espero que alguém possa ajudar. Eu tentei pesquisar no Google, mas não consegui encontrar outras pessoas com esse mesmo problema. Eu criei um cenário para explicar a situação.
Se eu trabalhar diretamente com um contexto EF, posso fazer uma seleção dentro de uma seleção. Por exemplo, isso executa perfeitamente:
// 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();
No entanto, se eu usar um padrão de repositório no qual o repositório está retornando IQueryable (ou mesmo ObjectSet ou ObjectQuery), recebo uma NotSupportedException (LINQ to Entities não reconhece o método 'System.Linq.IQueryable`1) ...
Aqui está um exemplo do meu repositório:
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;
}
}
// estou usando o repositório dentro de outra classe (por exemplo, na camada Serviços)
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();
O código acima gera uma NotSupportedException.
Sei que, se houver uma associação entre Empresas e Usuários da Empresa, simplesmente posso fazer isso e funcionará bem:
var companies3 = (from c in repository.GetCompanies()
select new {
Company = c,
UserCount = (from u in c.CompanyUsers
select u).Count()
}).ToList();
... mas meu exemplo é apenas uma versão simplificada de um cenário mais complicado em que não tenho associação entre as entidades.
Portanto, estou muito confuso por que o Entity Framework está lançando o NotSupportedException. Como é que a consulta funciona perfeitamente bem quando estou trabalhando diretamente com o contexto EF, mas não é suportada se estiver trabalhando com IQueryable retornado de outro método. Isso funcionou perfeitamente com o Linq 2 SQL, mas não parece funcionar no Entity Framework.
Qualquer insight seria muito apreciado.
Desde já, obrigado.