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.