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?

109221793
źródło
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);
Gidon
źródło
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);
Harold Sota
źródło
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);
Anji
źródło
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.

DavidRR
źródło
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();
topcool
źródło
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
maoyang
źródło