Включить с проекцией не работает - PullRequest
3 голосов
/ 27 октября 2011

У меня есть этот запрос

    var test = context.Assignments
        .Include(a => a.Customer)
        .Include(a => a.Subscriptions)
        .Select(a => new AssignmentWithSubscriptionCount { SubscriptionCount = a.Subscriptions.Count(), Assignment = a })
        .ToList();

    var name = test.First().Assignment.Customer.Name;

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

edit: Вот рьяная нагрузка с проекцией, которая работает, она более сложная, чем в примере выше, так что я не могу за свою жизнь понять, что не так, спасибо.

    var test = context.PublicationStateGroups
        .Include(p => p.PublicationStates.Select(ps => ps.AllowedPublicationStateActions.Select(aps => aps.PublicationStateAction)))
        .Select(psg => new StateAndGroupInfo
        {
            ShowReport = psg.PublicationStates.Any(p => p.PublicationStateReportTypeId.HasValue),
            Actions = psg.PublicationStates.SelectMany(state => state.AllowedPublicationStateActions)
                .Select(a => a.PublicationStateAction)
                .Distinct()
        }).ToList();

    var eagerTest = test.First().Actions.First().Name;

Ответы [ 2 ]

6 голосов
/ 28 октября 2011

Это по проекту . Include не для сценариев с проекцией или пользовательскими объединениями.

5 голосов
/ 27 октября 2011

Добавьте клиента к вашему прогнозу:

var test = context.Assignments
    .Select(a => new AssignmentWithSubscriptionCount
    {
        SubscriptionCount = a.Subscriptions.Count(),
        Assignment = a,
        Customer = a.Customer
    });

var name = test.First().Customer.Name;

Контекст EF, вероятно, обеспечит автоматическое заполнение Assignment.Customer.

Редактировать

Если вы не хотите или не можете изменить класс AssignmentWithSubscriptionCount, вы также можете проецировать в анонимный тип и затем скопировать результат в памяти в этот класс:

var test = context.Assignments
    .Select(a => new
    {
        SubscriptionCount = a.Subscriptions.Count(),
        Assignment = a,
        Customer = a.Customer
    });

test.ToList() // executes query
    .Select(o =>
    {
        o.Assignment.Customer = o.Customer;
        return new AssignmentWithSubscriptionCount
        {
            SubscriptionCount = o.SubscriptionCount,
            Assignment = o.Assignment
        }
    });

Другим вариантом является явная загрузка (хотя для каждой загруженной Assignment требуется одна дополнительная передача туда и обратно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...