Очень странно, но ты абсолютно прав. Свойства, которые возвращают 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.

Любое понимание будет с благодарностью.

Заранее спасибо.

Ответы на вопрос(2)

Ваш ответ на вопрос