Я только что переключился с Linq 2 SQL на Entity Framework, и я ' Я вижу в EF странное поведение, с которым, надеюсь, кто-нибудь может помочь. Я пробовал погуглить, но не смог найти других людей с такой же проблемой. Я придумал сценарий, чтобы объяснить ситуацию.
Если я работаю напрямую с 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 to 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;
}
}
// Я использую репозиторий внутри другого класса (например, в моем слое служб)
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.
Я понимаю, что если есть » s связь между компаниями и 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.
Любое понимание будет очень признательно.
Заранее спасибо.