Zapytanie LINQ, aby wybrać pierwszą piątkę


234

Mam zapytanie LINQ:

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

Jak mogę zmodyfikować to zapytanie, aby wybrać tylko pięć wyników z bazy danych?


Take (how_many_you_wish)
snr

Odpowiedzi:


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

5
+1, ale gah, zawijanie wyrażeń wielowierszowych w nawiasach, a następnie usunięcie odnośników z całej partii naprawdę naprawdę mi się podoba z jakiegoś powodu.
Doktor Jones

6
Wydaje się, że pobiera tyle wyników z bazy danych, ile odpowiada warunkom równości, i dopiero po ich pobraniu z bazy danych stosuje ograniczenie take (5) w aplikacji. Czy istnieje sposób na dosłownie taketylko pierwsze 5 wierszy z bazy danych?
JM Hicks

6
@JMHicks nie bardzo. Polecenie Take (5) dodaje tylko kolejny warunek do IQueryable, który nie zostanie wykonany, dopóki go nie policzysz. Jednak mogą istnieć dostawcy LINQ, którzy nie obsługują operacji Take.
Bruno Brant,

1
@JMHicks - to nie tak działa linq ... linq jest leniwy.
Hogan

39

Rozwiązanie:

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

19

Można to również osiągnąć stosując podejście Linq oparte na lambda;

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

8

[Oferując nieco bardziej opisową odpowiedź niż odpowiedź udzielona przez @Ajni .]

Można to również osiągnąć za pomocą płynnej składni LINQ :

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

Należy zauważyć, że każda z tych metod ( Where, OrderBy, Take), który pojawia się w tej instrukcji LINQ przyjmuje wyrażenie lambda jako argument. Należy również pamiętać, że dokumentacja Enumerable.Takezaczyna się od:

Zwraca określoną liczbę ciągłych elementów od początku sekwencji.


5

Additional information

Czasami konieczne jest powiązanie modelu z modelami widoku i podanie błędu konwersji typu . W tej sytuacji powinieneś użyć ToList()metody.

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

0

Samo myślenie, że możesz nie znać sekwencji Od-> Gdzie-> Wybierz, jak w skrypcie sql, to jest jak Select-> From-> Where.

Ale możesz nie wiedzieć, że wewnątrz Sql Engine jest on również analizowany w sekwencji „ From-> Where-> Select ”. Aby to sprawdzić, możesz wypróbować prosty skrypt

select id as i from table where i=3

i to nie działa, powodem jest silnik będzie analizować Gdzie przed Select , więc nie będzie wiedział, alias I w którym . Aby to zadziałało, możesz spróbować

select * from (select id as i from table) as t where i = 3
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.