Comment trouvez-vous le maximum dans LINQ groupe sage?
Question
Je suis en train de résoudre le problème « par groupes max » dans LINQ. Pour commencer, j'ai une base de données à l'aide du modèle Entity Framework avec la structure suivante:
Customer:
---------
CustomerID : Int32
Name : String
Order:
-------
OrderID : Int32
CustomerID : Int32
Total : Decimal
Cela me donne la navigation d'un client à ses ordres et un ordre au propriétaire.
Je suis en train de créer une requête LINQ qui me permet de trouver les commandes des clients haut 10 dans la base de données. Le cas simple était assez facile à trouver:
var q = (
from order in _data.Orders // ObjectQuery<Order>
orderby order.Amount descending select order
).Take(10);
Cependant, je voudrais montrer que les clients uniques dans cette liste. Je suis encore un peu nouveau pour LINQ, mais c'est ce que je suis venu avec:
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);
Cela semble fonctionner, mais je ne suis pas sûr que ce soit la meilleure approche. Plus précisément, je me demande sur la performance d'une telle requête sur une base de données très importante. En outre, selon la méthode de FirstOrDefault
de la requête du groupe semble un peu étrange ...
Quelqu'un peut-il fournir une meilleure approche, ou une certaine assurance que c'est la bonne?
La solution
Vous pouvez faire:
var q = (
from order in _data.Orders // ObjectQuery<Order>
orderby order.Amount descending select order
).Distinct().Take(10);
Je regarderais normalement le SQL généré, et voir ce qui est le meilleur.
Autres conseils
Customer
.Select(c=>new {Order= c.Orders.OrderByDescending(o=>o.Total).First()})
.OrderByDescending(o=>o.Total)
.Take(10);