Truy vấn LINQ để chọn năm đầu


234

Tôi có một truy vấn LINQ:

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

Làm cách nào tôi có thể sửa đổi truy vấn này để chọn chỉ năm kết quả từ cơ sở dữ liệu?


Lấy (how_many_you_wish)
snr

Câu trả lời:


436
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, nhưng gah, gói các biểu thức đa dòng trong ngoặc đơn và sau đó hủy tham chiếu toàn bộ lô thực sự làm tôi buồn vì một số lý do.
Bác sĩ Jones

6
Điều này dường như nhận được nhiều kết quả từ cơ sở dữ liệu phù hợp với các điều kiện bình đẳng và chỉ sau khi chúng được lấy từ cơ sở dữ liệu, nó mới áp dụng hạn chế Take (5) trong ứng dụng. Có cách nào để takechỉ 5 hàng đầu tiên từ cơ sở dữ liệu không?
JM Hicks

6
@JMHicks không thực sự. Lệnh Take (5) chỉ thêm một điều kiện khác vào IQueryable, lệnh này sẽ không thực thi cho đến khi bạn liệt kê nó. Tuy nhiên, có thể có các nhà cung cấp LINQ không hỗ trợ hoạt động Take.
Bruno Brant

1
@JMHicks - đó không phải là cách linq hoạt động ... linq lười biếng.
Hogan

39

Giải pháp:

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

19

Điều này cũng có thể đạt được bằng cách sử dụng phương pháp Linq dựa trên Lambda;

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

8

[Cung cấp một câu trả lời mô tả hơn một chút so với câu trả lời được cung cấp bởi @Ajni .]

Điều này cũng có thể đạt được bằng cách sử dụng cú pháp lưu loát LINQ :

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

Lưu ý rằng mỗi phương pháp ( Where, OrderBy, Take) mà xuất hiện trong bản Tuyên Bố LINQ này có một biểu thức lambda như một cuộc tranh cãi. Cũng lưu ý rằng tài liệu để Enumerable.Takebắt đầu bằng:

Trả về một số phần tử liền kề được chỉ định từ đầu chuỗi.


5

Additional information

Đôi khi, cần phải liên kết một mô hình thành một mô hình xem và đưa ra lỗi chuyển đổi loại . Trong tình huống này bạn nên sử dụng ToList()phương pháp.

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

Chỉ cần nghĩ rằng bạn có thể cảm thấy không quen thuộc với chuỗi From-> Where-> Chọn, như trong kịch bản sql, nó giống như Chọn-> Từ-> Where.

Nhưng bạn có thể không biết rằng bên trong Sql Engine, nó cũng được phân tích theo trình tự ' Từ-> Ở đâu-> Chọn ', để xác thực nó, bạn có thể thử một tập lệnh đơn giản

select id as i from table where i=3

và nó sẽ không hoạt động, lý do là động cơ sẽ phân tích ở đâu trước khi Chọn , vì vậy nó sẽ không biết bí danh i ở đâu . Để thực hiện công việc này, bạn có thể thử

select * from (select id as i from table) as t where i = 3
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.