2010-02-23 5 views
175

Я начинаю с базовым классом, который я хочу, чтобы манипулировать в списке с помощью LINQ, что-то вроде следующего:Multiple Заказывайте с LINQ

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

Это то, что я в конце концов нашел, чтобы решить мою проблему с помощью non 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 
} 

Что мне действительно интересно, если то же самое может быть достигнуто с помощью методов расширения на основе лямбда-офф родовое IEnumerable, чтобы сделать то же самое. Google говорит мне, что я могу сделать что-то вроде следующего, чтобы выполнить его

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

Однако, если я делаю это я получаю сообщение об ошибке выполнения, когда я попал заявление Еогеаспа. Ошибка говорит мне, что хотя бы один объект должен реализовать IComparible, что я вижу, поскольку я использую анонимный тип для метода .OrderBy().

Итак, есть ли способ выполнить то, что я хочу, используя способ Лямбда?

+3

Если вы хотите знать, что «беглые методы» являются соответствующими каждым возможным выражением запроса, прочитайте раздел 7.15.2 спецификации. –

+2

@ Эрик Липперт, есть Citation 3.0, Query Expression Translation Cheat Sheet, написанный Bart Desmet, который я нашел очень полезным в качестве быстрой справки: 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

Вы можете использовать методы расширение ThenBy и ThenByDescending:

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

Угадайте, что я должен полностью пройти API, прежде чем задавать вопрос;) Также похоже, что вы можете цепочки .ThenBy() операторов столько раз, сколько вам нужно. Еще раз спасибо! – sdanna

+23

как насчет '.AndThen()' –

+61

'Нет .AndThen()!' –

Смежные вопросы