update tutorial query multiple framework first columns code all entity-framework linq-to-entities ef-code-first

entity framework - tutorial - LINQ a entidades+Incluir+problema de tipo anónimo



linq entity framework c# (3)

Considerar:

Cliente de clase

Proyecto de clase

Boleto de clase

Respuesta de clase

Los clientes tienen una subcolección de proyectos, los proyectos tienen una sub colección de tickets y los tickets tienen una sub colección de respuestas.

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

No funciona Ni el proyecto ni el cliente se cargan al seleccionar los datos de esta manera.

Sé cómo hacerlo funcionar. Mi pregunta es por qué no funciona así?


Como mencionó Ladislav, Include solo funciona si seleccionas directamente la entidad Ticket . Como está proyectando otra información, se ignora la Include .

Esto debería proporcionar una buena solución:

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

En primer lugar, se podrá acceder a los Clients cada ticket directamente desde la propiedad de los Clients en el tipo anónimo. Además, Entity Framework debe ser lo suficientemente inteligente como para reconocer que ha retirado toda la colección de Client para cada Ticket , por lo que llamar a .Ticket.Client debería funcionar también.


Porque Include funciona solo si selecciona entidades directamente. Una vez que hagas la proyección Include es ignorado. No te diré por qué, pero simplemente funciona de esta manera.


Otra posibilidad es usar la solución de StriplingWarrior pero luego limpiar los datos intermedios del resultado final:

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