LINQ-Abfrage zur Auswahl der fünf besten

234

Ich habe eine LINQ-Abfrage:

var list = from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t;

Wie kann ich diese Abfrage ändern, um nur fünf Ergebnisse aus der Datenbank auszuwählen?

109221793
quelle
Nehmen Sie (how_many_you_wish)
snr

Antworten:

436
var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);
Gidon
quelle
5
+1, aber gah, mehrzeilige Ausdrücke in Klammern zu setzen und dann die ganze Menge zu de-referenzieren, regt mich aus irgendeinem Grund wirklich auf.
Doktor Jones
6
Dies scheint so viele Ergebnisse aus der Datenbank zu übernehmen, wie den Gleichheitsbedingungen entsprechen, und erst nachdem sie aus der Datenbank entnommen wurden, wird die Einschränkung take (5) innerhalb der Anwendung angewendet. Gibt es eine Möglichkeit, buchstäblich takenur die ersten 5 Zeilen aus der Datenbank zu entfernen?
JM Hicks
6
@ JMHicks nicht wirklich. Der Befehl Take (5) fügt dem IQueryable nur eine weitere Bedingung hinzu, die erst ausgeführt wird, wenn Sie sie aufzählen. Möglicherweise gibt es jedoch LINQ-Anbieter, die den Take-Vorgang nicht unterstützen.
Bruno Brant
1
@JMHicks - so funktioniert linq nicht ... linq ist faul.
Hogan
39

Die Lösung:

var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);
Harold Sota
quelle
19

Dies kann auch mit dem Lambda-basierten Ansatz von Linq erreicht werden.

var list = ctn.Items
.Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
.OrderBy(t => t.Delivery.SubmissionDate)
.Take(5);
Anji
quelle
8

[Bietet eine etwas aussagekräftigere Antwort als die Antwort von @Ajni .]

Dies kann auch mithilfe der fließenden LINQ- Syntax erreicht werden :

var list = ctn.Items
    .Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
    .OrderBy(t => t.Delivery.SubmissionDate)
    .Take(5);

Man beachte , dass jede Methode ( Where, OrderBy, Take) , das erscheint in dieser Anweisung einen LINQ nimmt Lambda - Ausdruck als Argument. Beachten Sie auch, dass die Dokumentation für Enumerable.Takebeginnt mit:

Gibt eine bestimmte Anzahl zusammenhängender Elemente vom Beginn einer Sequenz zurück.

DavidRR
quelle
5

Additional information

Manchmal ist es erforderlich, ein Modell in ein Ansichtsmodell zu binden und einen Typkonvertierungsfehler anzugeben . In dieser Situation sollten Sie die ToList()Methode verwenden.

var list = (from t in ctn.Items
       where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
       orderby t.Delivery.SubmissionDate
       select t).Take(5).ToList();
topcool
quelle
0

Ich denke nur, dass Sie sich mit der Sequenz From-> Where-> Select nicht vertraut fühlen, wie im SQL-Skript, es ist wie Select-> From-> Where.

Möglicherweise wissen Sie jedoch nicht, dass es in Sql Engine auch in der Reihenfolge ' Von-> Wo-> Auswählen ' analysiert wird. Um dies zu überprüfen , können Sie ein einfaches Skript ausprobieren

select id as i from table where i=3

und es wird nicht funktionieren, der Grund ist, dass die Engine Where before Select analysiert , sodass sie den Alias ​​i in where nicht kennt . Damit dies funktioniert, können Sie es versuchen

select * from (select id as i from table) as t where i = 3
Maoyang
quelle