2010-03-29 14 views
6

Bu kod yeniden düzenlenebilir mi? Tek fark, bölüm tarafından verilen emirdir.LINQ sorgusu, aynı sorguda artan veya azalan bir araca ihtiyaç duyuyor

Idealy ben kod yeniden ama sorgu operatörleri OrderBy şartlı eklemeyi biliyorum ve çıkarmayın ve OrderByDescending rakamlarla

var linq = new NorthwindDataContext(); 

     var query1 = linq.Customers 
      .Where(c => c.ContactName.StartsWith("a")) 
      .SelectMany(cus=>cus.Orders) 
      .OrderBy(ord => ord.OrderDate) 
      .Select(ord => ord.CustomerID); 

     var query2 = linq.Customers 
      .Where(c => c.ContactName.StartsWith("a")) 
      .SelectMany(cus => cus.Orders) 
      .OrderByDescending(ord => ord.OrderDate) 
      .Select(ord => ord.CustomerID); 

cevap

12

bu hangi yapacak kullanabilirsiniz azalan eğer karar nerede bir durum varsa:

ThenBy için
public static IOrderedQueryable<TSource> OrderBy<TSource, TKey> 
    (this IQueryable<TSource> source, 
    Expression<Func<TSource, TKey>> keySelector, 
    bool ascending) 
{ 
    return ascending ? source.OrderBy(keySelector) 
      : source.OrderByDescending(keySelector); 
} 

ve benzer:

public static IOrderedQueryable<TSource> ThenBy<TSource, TKey> 
    (this IOrderedQueryable<TSource> source, 
    Expression<Func<TSource, TKey>> keySelector, 
    bool ascending) 
{ 
    return ascending ? source.ThenBy(keySelector) 
      : source.ThenByDescending(keySelector); 
} 
+0

Cool. Sağol Jon. –

+0

Konu kapalı, ancak yukarıdaki Linq2SQL için doğru çevirir mi? IOW, 'desteklenmeyen' bir yöntemi görmek ve bir sözdizimi ağacı oluşturmadan ve SQL'i oluşturmadan önce yürütmek için yeterince akıllıdır? Sadece merak, hiç denemedim. :) – leppie

+1

@leppie: Sadece mevcut Queryable yöntemlerini çağırıyor - bunlar ifade ağacını oluşturan şey. Şu anda, * eşdeğer uzantı yöntemlerini yazabilmenize rağmen, IE'nin * IEnumerable 'karşısına çıkmayacağını unutmayın. –

0

vb böylece bir temsilci/Lambda ifade kullanmak istiyorum normalde 'sipariş değişkenini' reddedebilirsiniz.

DateTime ile çok emin değilim. Timespan kullanmayı deneyebilirsiniz.

2

Sorgunuzu bitlere bölebilir ve kontrol akış mantığını kullanabilirsiniz. LINQ to SQL, tüm satırı yazmış olsaydınız doğru sorguyu sihirli bir şekilde oluşturacaktır! Bunun nedeni, sorguyu veri isteyinceye kadar veritabanına gönderilmemesi, bunun yerine bir ifade olarak saklanmasıdır.

var linq = new NorthwindDataContext(); 
var query = linq.Customers 
    .Where(c => c.ContactName.StartsWith("a")) 
    .SelectMany(cus=>cus.Orders); 

IOrderedQueryable<Order> query2; 
if (useAscending) { 
    query2 = query.OrderBy(ord => ord.OrderDate); 
} else { 
    query2 = query.OrderByDescending(ord => ord.OrderDate); 
} 

var query3 = query2.Select(ord => ord.CustomerID); 
+0

Errorrr !!!!!!!!! Siparişinizin seçilmeden önce gerçekleşmesi gerekiyor, başka biriyle uğraşıyorsunuz :) – leppie

+0

Teşekkürler Mark. Sorgu operatörleri tarafından siparişin, select() öğesinden sonra yerleştirilmesi önemli midir? –

+0

@leppie: Evet, kusura bakmadım! –

0

Eh, sipariş ile artan veya kendi yeniden kullanılabilir uzatma yöntemi oluşturabilir

var query1 = linq.Customers 
.Where(c => c.ContactName.StartsWith("a")) 
.SelectMany(cus=>cus.Orders) 

if(SortAscending) 
    query1 = query1.OrderBy(ord => ord.OrderDate); 
else 
    query1 = query1.OrderByDescending(ord => ord.OrderDate); 

var query2 = query1.Select(ord => ord.CustomerID); 
+0

Gördüğünüz gibi, aynı hatayı aşağıdaki cevap olarak da yaptınız (düzeltildi). – leppie

+0

@leppie: Sadece sabit değil, aynı zamanda aşağıda, aşağıda değil. Bu yüzden yorumunuz yanlış ve muhtemelen daha yararlı! Bir referans kullanmaya çalışmak yerine neden sadece yorumunuzu tekrarlamıyorsunuz? Diğer bir deyişle, şunu yazınız: '' Siparişiniz seçilmeden önce gerçekleşmeli, başka bir tiple uğraşıyorsunuz '. ;-) –

+0

İşte, düzeltin. Ancak sanırım jon'un cevabını kendim de tercih ederim ;-) –

1
return from T in bk.anbarsabts 
     where T.kalaname == str 
     orderby T.date descending 
     select new { T.date, T.kalaname, T.model, T.tedad }; 
İlgili konular