Вопрос о включении метода в Entity Framework - PullRequest
4 голосов
/ 05 июля 2011

Я создаю веб-сайт на asp.net MVC и использую интерфейс хранилища для использования хранилища в памяти и использования базы данных.

У меня исправлены все мои отношения, что я имею в виду, например, когда у меня есть один контакт, чем у него есть адреса, поэтому ... когда я добавляю один адрес к этому контакту, автоматически исправляет связь для адреса. Контакт указывает на контакт и я оставляю свойства виртуальными для структуры сущностей, затем создаю прокси-серверы, используя хранилище базы данных.

Мой вопрос начинается здесь:

У меня есть такой запрос:

return query.Where(c => c.UserID == clientId)
                         .Include(c => c.AssignedProjects)
                         .Select(c => new UserDetailsData<Client>
                         {
                             User = c,
                             IssuesCount = c.IssuesReported.Count()
                         }).Single();

, который использует include. Если я удаляю, Select selectedProjects будет содержать проекты для этого клиента, но когда я включаю Select AssignedProjects, он будет нулевым, а анонимный объект в порядке, но .. пользователь не содержит AssignedProjects.

В памяти я могу это сделать, но с помощью EF я не могу.

Последний график, который мне нужен, это: пользователь с clientID, имеющий коллекцию AssignedProjects со своими проектами и создающий анонимный объект с User (с коллекцией) и IssuesCount, передающий представление, чтобы показать AssignedProjects, информацию о пользователе и номер проблем, о которых сообщил клиент ..

Кто-нибудь знает, как я могу решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 06 июля 2011

Вы можете попробовать это:

return query.Where(c => c.UserID == clientId)
            .Select(c => new UserDetailsData<Client>
            {
                User = c,
                AssignedProjects = c.AssignedProjects,
                IssuesCount = c.IssuesReported.Count()
            }).Single();

Хотя вы на самом деле не интересуетесь свойством AssignedProjects типа, который вы проецируете в него, оно также заполнит свойство User.AssignedProjects.Это использует «диапазон отношений», функцию в EF, которая автоматически создает навигационные свойства объектов, загруженных в контекст.

Имейте в виду, что это действительно зависит от того, что вы загружаете объекты в контекст.Если вы отключите отслеживание - например, используя AsNoTracking() в своем запросе - оно больше не будет работать.

0 голосов
/ 06 июля 2011

Включить (активная загрузка) не работает с Select (проекция), поскольку генерирует выражение хранилища с использованием Entity Framework.

Вы можете найти более подробную информацию Если я выберу из IQueryable, то Включить будет потеряно , и вы также можете увидеть работу там.

Я не уверен, будет ли работать обход, который был перечислен, хотя в вашем случае, поскольку у вашей проекции есть несколько возвращений (а не ожидаемый объект).

Поскольку вы заявили, что конечный график - это то, что вам нужно, помимо выполнения фактического подсчета, почему бы не превратить это в:

var user = query.Where(c => c.UserID == clientId)
    .Include(c => c.AssignedProjects)
    .Include(c => c.IssuesReported)
    .Single();

var userDetailsData = new UserDetailsData<Client>()
{
    User = user,
    IssuesCount = user.IssuesReported.Count(),
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...