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?

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top