Pregunta

Estoy tratando de resolver el problema "max-grupo de sabios" en LINQ. Para empezar, he modelado una base de datos utilizando el marco de la entidad con la siguiente estructura:

Customer:
---------
CustomerID : Int32
Name : String

Order:
-------
OrderID : Int32
CustomerID : Int32
Total : Decimal

Esto me da la navegación de un cliente a sus órdenes y una orden para el propietario.

Estoy intentando crear una consulta LINQ que me permite encontrar los pedidos de los clientes top-10 en la base de datos. El simple caso fue bastante fácil para llegar a:

var q = (
    from order in _data.Orders  // ObjectQuery<Order>
    orderby order.Amount descending select order
).Take(10);

Sin embargo, me gustaría mostrar sólo para clientes únicos en esta lista. Todavía estoy un poco nuevo LINQ, pero esto es lo que he llegado con:

var q = (
    from order in _data.Orders  // ObjectQuery<Order>
    group order by order.Customer into o
    select new {
        Name = o.Key.Name,
        Amount = o.FirstOrDefault().Amount
    }
).OrderByDescending(o => o.Amount).Take(10);

Esto parece funcionar, pero no estoy seguro de si este es el mejor enfoque. En concreto, me pregunto sobre el rendimiento de una consulta de esa índole contra una base de datos muy grande. Además, utilizando el método de la consulta FirstOrDefault grupo se ve un poco extraño ...

Puede cualquier persona proporcionar un mejor enfoque, o alguna garantía de que esta es la correcta?

¿Fue útil?

Solución

Se puede hacer:

var q = (
    from order in _data.Orders  // ObjectQuery<Order>
    orderby order.Amount descending select order
).Distinct().Take(10);

Me generalmente se fijan en el SQL generado, y ver cuál es la mejor.

Otros consejos

Customer
.Select(c=>new {Order= c.Orders.OrderByDescending(o=>o.Total).First()})
.OrderByDescending(o=>o.Total)
.Take(10);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top