2016-04-11 18 views
1

... en benim veritabanında bir tablo tarafından oluşturulan bir tablo var diyelim ..OrderBy 3 farklı özellikler açıklama amaçlı Amacıyla

Bu tablo bilgi FlightDate, Aircraft, Pre/Post 3 adet tutar.

Yani, bu arkasındaki mantık bir uçuş öncesi ve günde bir uçuş sonrası olması gerektiğidir.

Şimdi, netlik için, masa şimdiye kadar bu gibi görünüyor diyelim

:

|Date| | |Aircraft| | |Pre/Post| 

04/08/2016 |  aircraft1 |  Pre-Flight 
04/08/2016 |  aircraft3 |  Pre-Flight 
04/08/2016 |  aircraft2 |  Pre-Flight 
04/08/2016 |  aircraft3 |  Post-Flight 
04/08/2016 |  aircraft1 |  Post-Flight 
04/08/2016 |  aircraft2 |  Post-Flight 

belki tarih hariç bu tablo tarafından hiçbir düzen (orada görebileceğiniz gibi, ama o kadar kolay bu yapılan). Ben ne istiyorum ne Şimdi

böylece esasen ben ne arıyorum ...

sayfa yüklendiğinde Aircraft tarafından sipariş edilmesi tablo için, bu tabloyu görüntülemek için zaman olduğunu ve Date üzerine Pre/Post dayanıyor için:

|Date|  | |Aircraft| | |Pre/Post| 

04/08/2016 |  aircraft1 |  Pre-Flight 
04/08/2016 |  aircraft1 |  Post-Flight 
04/08/2016 |  aircraft2 |  Pre-Flight 
04/08/2016 |  aircraft2 |  Post-Flight 
04/08/2016 |  aircraft3 |  Pre-Flight 
04/08/2016 |  aircraft3 |  Post-Flight 
04/09/2016 |  aircraft1 |  Pre-Flight 
04/09/2016 |  aircraft1 |  Post-Flight 
etc   |  etc   |  etc 

bu sonuca ulaşmak için .OrderBy yöntemi kullanmak için bir yolu var mı?

her zaman Sonrası uçuş değerlerini önüne üzere Uçuş öncesi değerini istediğim için
// This would order by FlightDate, Aircraft then PrePost 
var aircraftFlights = context.AircraftFlights.OrderBy(a => a.FlightDate) 
              .ThenBy(a => a.Aircraft) 
              .ThenBy(a => a.PrePost); 

, açıkça düşünebilirsiniz:

cevap

7

Sen zinciri birlikte sırasıyla ilk ThenBy() ile bir veya ThenByDescending() takip ederek birden OrderBy() çağrılar can (Ön alfabetik Direk- sonra gelir gibi) o sütun için bir OrderByDescending() kullanarak:

// Consider using ThenByDescending to get your Pre/Post ordering correct 
.ThenBy(a => a.PrePost); 

Sen ihtiyaçlarınıza göre bu uyarlayabilirsiniz. Temel olarak, ilk OrderBy() aramanızı çağırdığınızda, koleksiyonunuz, ThenBy() ve ThenByDescending() çağrılarını gösteren bir OrderedEnumerable haline gelir ve bunları birlikte zincirleme işlemlerini gerçekleştirir.

+0

Beni ona yendi kontrol ediniz!;) Belki de tam referansı almak için MSDN referansını en çok kopyalamak ister misiniz? – Toxantron

+0

Tüm yöntemlerim, kendi MSDN başvurularına işaret etmiş olmalıdır. Mavi-mavi her zaman düz gri IMO'dan daha iyi görünür. :) –

+0

Ve sen de bana bunu yendin. : D Ardından eklenecek hiçbir şey kalmadı. – Toxantron

2

OrderBy'yi ve ardından uygulamak istediğiniz her sipariş kısıtlaması için ThenBy çağrılarını kullanabilirsiniz. senin enumerator varsayarsak sipariş böyle görünebilir her üç özelliğe sahiptir şunlardır:

myEnumerable.OrderBy(x => x.Aircraft).ThenBy(z => z.PrePost).ThenBy(a => a.Date); 
+1

O tarihe göre sıralama yapmak istiyor. – Stilgar

+0

Bu, ve OP'nin, '' PrePost''dan önce Tarih/Uçak * ile sipariş vermesi gerekecektir. Yani tüm sipariş burada yanlış. –

+0

OP'nin başarmak istediği kesin siparişle endişelenmekten ziyade sözdizimi göstermeye çalıştım. – davidallyoung

2

Sen Pre/Post sütun değerlendirmek üzere bir lambda kullanarak OrderBy ve ThenBy birleştirmek gerekir. Böyle Yani bir şey:

var orderedTable = table.OrderBy(t => t.Aircraft). 
    ThenBy(t => t.Date). 
    ThenBy(t => t.PrePost == "Post-Flight" ? 1 : 0); 
1

System.Linq ait ThenBy uzantısını kullanın.

Kodunuz şöyle olabilir: Referans olarak

var ordered = myFlights.OrderBy(f => f.Aircraft) 
         .ThenBy(f => f.prePost) 
         .ThenBy(f => f.Date); 

MSDN documentation

+0

Bu sadece DavidY'nin önceki cevabından doğrudan bir kopuş değil, David'in cevabı gibi, buradaki sipariş tamamen yanlıştır. –

+0

Sadece gönderdiğim emri gördükten sonra adil ve tüm cevaplar siparişin dışında aynıdır ve itiraf ettiğimi itiraf ettiğimi itiraf ediyorum. – Toxantron