Jeroen
Jeroen

Reputation: 4023

LINQ To Entities + Include + Anonymous type issue

Consider:

Class Client

Class Project

Class Ticket

Class Reply

Clients have a sub collection of projects, projects have a sub collection of tickets and tickets have a sub collection of replies.

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

Doesn't work. Neither project nor client are loaded when selecting data this way.

I know how to make it work. My question is why doesn't it work like this?

Upvotes: 14

Views: 4861

Answers (3)

Patrick McDonald
Patrick McDonald

Reputation: 65451

Another possibility is to use StriplingWarrior's solution but then cleanse the intermediate data from the final result:

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
        });

Upvotes: 2

StriplingWarrior
StriplingWarrior

Reputation: 156624

As Ladislav mentioned, Include only works if you select the Ticket entity directly. Since you're projecting other information out, the Include gets ignored.

This should provide a good work-around:

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

First of all, each Ticket's Clients will be accessible directly from the Clients property on the anonymous type. Furthermore, Entity Framework should be smart enough to recognize that you have pulled out the entire Client collection for each Ticket, so calling .Ticket.Client should work as well.

Upvotes: 15

Ladislav Mrnka
Ladislav Mrnka

Reputation: 364369

Because Include works only if you select entities directly. Once you do the projection Include is ignored. I will not tell you why but it simply works this way.

Upvotes: 8

Related Questions