Entity Framework Take N elementos de la colección secundaria

Di que tengo un Customer entidad y una Sales entidad, de relación 1 a muchos. ¿Cómo podría obtener todos los Clientes con N número de ventas más recientes?

var result = Customers.Where(c => c.Sales.Any());

Esto devolvería a todos los clientes con TODAS sus ventas. ¿Qué pasa si quiero solo 2 registros de ventas de cada cliente?

P/S: puedo hacer eso con la sintaxis de consulta, estoy buscando una solución de sintaxis de método. Simplemente no puedo entender cómo encadenarlos juntos en forma de sintaxis de método

var result = from cust in context.Customers
             select new
             {
                 Customers = cust,
                 Sales = cust.Sales.OrderBy(s => s.Date).Take(2)
             };

Esto funciona, pero no estoy seguro de si esta es la mejor manera de hacerlo.

EDITAR: OK, resulta que la sintaxis de consulta que incluí aquí tampoco funciona. Solo el Sales en el tipo anónimo se reduce efectivamente a 2 registros.

var filtered = result.AsEnumerable().Select(r => r.Customers);

hacer esto todavía resultará en una lista de clientes con TODAS sus ventas

preguntado el 03 de mayo de 12 a las 17:05

¿podría publicar su consulta de sintaxis de consulta? -

actualizado con código de sintaxis de consulta -

1 Respuestas

Puede hacer un proyecto como se describe en aquí

var dbquery = Customers.Select( c => new { 
                        Customer = c,
                        Sales = c.Sales.OrderBy(s => s.Date)
                             .Take(2).Select( s => new { s, s.SalesDetails})
                  });

var customers = dbquery 
   .AsEnumerable() 
   .Select(c => c.Customer);

contestado el 04 de mayo de 12 a las 08:05

simplemente agregue la cláusula where para c.Sales.Any() - Habib

esto todavía me devuelve clientes con TODAS las ventas incluidas :( - Kagawa

@Taetsu Desactive la carga diferida antes de acceder Sales propiedad por configuración context.Configuration.LazyLoadingEnabled = false; - Eranga

girando el LazyLoadingEnabled = false hace el truco, sin embargo, esto causa otro problema, ahora las entidades relacionadas ya no se cargan. Obtuve una referencia de objeto nulo tratando de acceder s.SalesDetails. .Include() tampoco ayuda. - Kagawa

Parece .Include() no se puede aplicar cuando proyecta su consulta. Está funcionando como se esperaba si saco el proyecto. - Kagawa

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.