Permintaan LINQ untuk memilih lima besar

234

Saya punya permintaan LINQ:

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

Bagaimana saya bisa memodifikasi kueri ini untuk memilih hanya lima hasil dari database?

109221793
sumber
Ambil (how_many_you_wish)
SNR

Jawaban:

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
sumber
5
+1, tapi gah, membungkus ekspresi multiline dalam tanda kurung dan kemudian mende-referensikan seluruh banyak benar-benar membuatku marah untuk beberapa alasan.
Dokter Jones
6
Ini tampaknya mengambil sebanyak mungkin hasil dari database sesuai dengan kondisi kesetaraan, dan hanya setelah mereka diambil dari database apakah itu menerapkan pembatasan take (5) dalam aplikasi. Apakah ada cara untuk secara harfiah takehanya 5 baris pertama dari database?
JM Hicks
6
@ JMHicks tidak juga. Perintah Take (5) hanya menambahkan kondisi lain ke IQueryable, yang tidak akan dijalankan sebelum Anda menyebutkannya. Namun, mungkin ada penyedia LINQ yang tidak mendukung operasi Take.
Bruno Brant
1
@ JMHicks - itu bukan cara LINQ bekerja ... LINQ malas.
Hogan
39

Solusinya:

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
sumber
19

Ini juga dapat dicapai dengan menggunakan pendekatan berbasis Linda Lambda;

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

[Menawarkan jawaban yang agak lebih deskriptif daripada jawaban yang diberikan oleh @Ajni .]

Ini juga dapat dicapai dengan menggunakan sintaks LINQ yang lancar :

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

Perhatikan bahwa setiap metode ( Where, OrderBy, Take) yang muncul dalam pernyataan LINQ ini membutuhkan ekspresi lambda sebagai argumen. Perhatikan juga bahwa dokumentasi untuk Enumerable.Takedimulai dengan:

Mengembalikan sejumlah elemen berdekatan yang ditentukan dari awal urutan.

DavidRR
sumber
5

Additional information

Kadang-kadang perlu untuk mengikat model menjadi model tampilan dan memberikan kesalahan konversi tipe . Dalam situasi ini Anda harus menggunakan ToList()metode.

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
sumber
0

Hanya berpikir Anda mungkin merasa asing dengan urutan From-> Where-> Select, seperti dalam skrip sql, itu seperti Select-> From-> Where.

Tapi Anda mungkin tidak tahu bahwa di dalam Mesin Sql, itu juga diuraikan dalam urutan ' Dari-> Di mana-> Pilih ', Untuk memvalidasi itu, Anda dapat mencoba skrip sederhana

select id as i from table where i=3

dan itu tidak akan berfungsi, alasannya adalah mesin akan mengurai Dimana sebelum Pilih , sehingga tidak akan tahu alias saya di mana . Untuk membuat ini bekerja, Anda dapat mencoba

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