Я только что перешел из Linq 2 SQL в Entity Framework, и я вижу странное поведение в EF, что я надеюсь, что кто-то может помочь. Я попробовал Googling, но я не смог найти других людей с этой же проблемой. Я издевался над сценарием, чтобы объяснить ситуацию.Структура Entity Framework и шаблон хранилища (проблема с IQueryable)
Если я работаю напрямую с контекстом EF, я могу сделать выбор в пределах выбора. Например, это выполняется прекрасно:
// 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();
Однако, если я использую хранилище шаблон, где хранилище возвращающегося IQueryable (или даже ObjectSet или ObjectQuery), я получаю NotSupportedException (LINQ к Entities не распознает метод «System.Linq.IQueryable`1) ...
Вот пример моего репозитория:
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;
}
}
// Я использую хранилище внутри другого класса (например, в моем слое Services)
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();
Вышеупомянутый код генерирует исключение NotSupportedException.
Я понимаю, что если есть связь между компаниями и CompanyUsers, то я могу просто сделать это, и он будет работать нормально:
var companies3 = (from c in repository.GetCompanies()
select new {
Company = c,
UserCount = (from u in c.CompanyUsers
select u).Count()
}).ToList();
... но мой пример просто упрощенная версия более сложным где у меня нет связи между сущностями.
Так что я очень смущен, почему Entity Framework бросает NotSupportedException. Как получается, что запрос работает отлично, когда я напрямую работаю с контекстом EF, но он не поддерживается, если я работаю с IQueryable, возвращенным из другого метода. Это отлично работало с Linq 2 SQL, но, похоже, оно не работает в Entity Framework.
Любое понимание было бы весьма полезным.
Заранее спасибо.
Зачем нам это нужно, я имею в виду, что у нас есть ассоциация здесь? – paragy
+1 U ответил тоже. – paragy
Для этого требуется два раунда поездки на сервер, хотя ... подождите, не так ли? –