Frage

Ich versuche, das Problem der "gruppenwise maximal" in Linq zu lösen. Zu Beginn habe ich eine Datenbank unter Verwendung des Entity -Frameworks mit der folgenden Struktur modelliert:

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

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

Dies gibt mir die Navigation von einem Kunden zu ihren Bestellungen und einer Bestellung an den Besitzer.

Ich versuche, eine Linq-Abfrage zu erstellen, mit der ich die Top-10-Kundenbestellungen in der Datenbank finden kann. Der einfache Fall war ziemlich einfach zu finden:

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

Ich möchte jedoch nur einzigartige Kunden in dieser Liste zeigen. Ich bin immer noch ein bisschen neu in Linq, aber das habe ich mir ausgedacht:

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

Dies scheint zu funktionieren, aber ich bin mir nicht sicher, ob dies der beste Ansatz ist. Insbesondere wundere ich mich über die Ausführung einer solchen Abfrage gegen eine sehr große Datenbank. Auch die Verwendung der FirstOrDefault Methode aus der Gruppenabfrage sieht etwas seltsam aus ...

Kann jemand einen besseren Ansatz oder eine gewisse Sicherheit liefern, dass dies der richtige ist?

War es hilfreich?

Lösung

Du könntest es tun:

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

Normalerweise würde ich mir die generierte SQL ansehen und sehen, was das Beste ist.

Andere Tipps

Customer
.Select(c=>new {Order= c.Orders.OrderByDescending(o=>o.Total).First()})
.OrderByDescending(o=>o.Total)
.Take(10);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top