2010-02-23 102 views
175

我開始使用LINQ,這樣的事情我想在一個列表操縱基本類以下內容:多個訂單通過與LINQ

public class FooBar 
{ 
    public virtual int Id { get; set; } 
    public virtual string Foo{ get; set; } 
    public virtual string Bar{ get; set; } 
} 

這是我最終發現了使用,以解決我的問題非lambda LINQ的東西。

// code somewhere else that works and gets the desired results 
var foobarList = GetFooBarList(); // Abstracted out - returns List<Foobar> 

// Interesting piece of code that I want to examine 
var resultSet = from foobars in foobarList 
       orderby foobars.Foo, foobars.Bar 
       select foobars; 

// Iterate and do something interesting 
foreach (var foobar in resultSet) 
{ 
    // Do some code 
} 

我真的很好奇是什麼,如果同樣可以使用基於LAMBDA擴展方法關閉通用IEnumerable的完成同樣的事情來完成。谷歌告訴我,我可以這樣做以下來完成它

var resultSet = foobarList.OrderBy(x => new {x.Foo, x.Bar}) 
          .Select(x=>x); 

但如果我這樣做,我得到一個運行時錯誤,當我打的foreach語句。該錯誤告訴我,至少有一個對象必須實現IComparible,我可以看到,因爲我使用.OrderBy()方法的匿名類型。

那麼有沒有辦法使用Lambda的方式來完成我想要的?

+3

如果你想知道「流利的方法」分別對應於每一個可能的查詢表達式是什麼,閱讀規範的節7.15.2。 –

+2

@Eric Lippert,有一個由Bart Desmet編寫的C#3.0查詢表達式翻譯備忘單,我發現它非常適用於快速參考:http://bartdesmet.net/blogs/bart/archive/2008/08/30/ c-3-0-query-expression-translation-cheat-sheet.aspx。 –

+0

可能重複[多個「在LINQ中的順序](http://stackoverflow.com/questions/298725/multiple-order-by-in-linq) – jrummell

回答

416

您可以使用ThenByThenByDescending擴展方法:

foobarList.OrderBy(x => x.Foo).ThenBy(x => x.Bar) 
+7

猜猜我應該在提出問題之前完全通過API; )它也看起來像你可以鏈接.ThenBy()語句儘可能多的次數。再次感謝! – sdanna

+23

'.AndThen()' –

+61

'No。And Then()!' –