2010-02-23 52 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()!' –