İlk beşi seçmek için LINQ sorgusu


234

Bir LINQ sorgusu var:

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

Veritabanından yalnızca beş sonuç seçmek için bu sorguyu nasıl değiştirebilirim?


Al (how_many_you_wish)
snr

Yanıtlar:


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, ancak gah, çok satırlı ifadeleri parantez içinde sararak ve sonra tüm lottan atıfta bulunma beni bir nedenden dolayı gerçekten rendeliyor.
Doktor Jones

6
Bu, eşitlik koşullarıyla eşleştiği kadar veritabanından çok fazla sonuç alıyor gibi görünüyor ve ancak veritabanından alındıktan sonra uygulama içinde take (5) kısıtlamasını uyguluyor. Kelimenin tam anlamıyla takeveritabanından sadece ilk 5 satır için bir yolu var mı ?
JM Hicks

6
@JMHicks gerçekten değil. Take (5) komutu, IQueryable'a yalnızca siz numaralandırılana kadar yürütülmeyecek başka bir koşul ekliyor. Ancak, Al işlemini desteklemeyen LINQ sağlayıcıları olabilir.
Bruno Brant

1
@JMHicks - linq bu şekilde çalışmaz ... linq tembeldir.
Hogan

39

Çözüm:

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

19

Bu aynı zamanda Linq'in Lambda temelli yaklaşımı kullanılarak da gerçekleştirilebilir;

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

8

[ @Ajni tarafından verilen cevaptan biraz daha açıklayıcı bir cevap vermek .]

Bu ayrıca LINQ akıcı sözdizimi kullanılarak da gerçekleştirilebilir :

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

Not her yöntem (diğer bir deyişle Where, OrderBy, Take) Bu LINQ tablosunda görünür bir alır lambda ifade , bağımsız değişken olarak. Ayrıca, belgelerin aşağıdakilerle Enumerable.Takebaşladığını unutmayın :

Bir dizinin başlangıcından itibaren belirtilen sayıda bitişik öğeyi döndürür.


5

Additional information

Bazen bir modeli görünüm modellerine bağlamak ve bir tür dönüştürme hatası vermek gerekir . Bu durumda ToList()yöntemi kullanmalısınız .

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

Sadece, sql komut dosyasında olduğu gibi, Select-> Where-> Select dizisine yabancı olduğunuzu düşünmek Select- > From-> Where gibidir.

Ancak, Sql Engine içinde, ' Kimden-> Nerede-> Seç ' sırasında da ayrıştırıldığını bilmiyor olabilirsiniz, Doğrulamak için basit bir komut dosyası deneyebilirsiniz

select id as i from table where i=3

ve iş olmaz, nedeni motor ayrıştırmak olacaktır Nerede önce Select o i takma bilmez, bu yüzden nerede . Bu işi yapmak için deneyebilirsiniz

select * from (select id as i from table) as t where i = 3
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.