Entity Framework и шаблон репозитория (проблема с IQueryable)

Я только что переключился с 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.

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

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

7
задан Johnny Oshika 27 November 2010 в 06:43
поделиться