LINQ To Entities + Включить + Проблема анонимного типа - PullRequest
13 голосов
/ 24 августа 2011

Рассмотрим:

Класс клиента

Класс проекта

Классный билет

Класс ответа

У клиентов есть подколлекция проектов, у проектов есть подколлекция заявок, а у билетов есть подколлекция ответов.

var data = ctx.Set<Ticket>().Include(p => p.Client).
Select(p => new { Ticket = p, LastReplyDate = p.Replies.Max(q => q.DateCreated)});

Не работает. При выборе данных таким способом ни проект, ни клиент не загружаются.

Я знаю, как заставить это работать. Мой вопрос: почему это так не работает?

Ответы [ 3 ]

12 голосов
/ 24 августа 2011

Как упоминал Ладислав, Include работает только в том случае, если вы выбираете объект Ticket напрямую.Поскольку вы проецируете другую информацию, Include игнорируется.

Это должно обеспечить хороший обходной путь:

var data = ctx.Set<Ticket>()
    .Select(p => new 
         { 
             Ticket = p, 
             Clients = p.Client,
             LastReplyDate = p.Replies.Max(q => q.DateCreated)
         });

Прежде всего, клиенты Клиента будут доступнынепосредственно из свойства Clients анонимного типа.Более того, Entity Framework должен быть достаточно умен, чтобы признать, что вы извлекли всю коллекцию Client для каждого Ticket, поэтому вызов .Ticket.Client также должен работать.

5 голосов
/ 24 августа 2011

Потому что Include работает, только если вы выбираете объекты напрямую. После этого проекция Include игнорируется. Я не скажу вам, почему, но это просто работает таким образом.

2 голосов
/ 15 апреля 2014

Другая возможность - использовать решение StriplingWarrior, но затем очистить промежуточные данные от конечного результата:

var data = ctx.Set<Ticket>()
    .Select(p => new 
        { 
            Ticket = p, 
            Clients = p.Client,
            LastReplyDate = p.Replies.Max(q => q.DateCreated)
        })
    .AsEnumerable()
    .Select(p => new
        {
            Ticket = p.Ticket, 
            LastReplyDate = p.LastReplyDate
        });
...