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