2010-02-23 8 views
175

comienzo con una clase básica que quiero manipular en una lista utilizando LINQ, algo como lo siguiente:múltiplos By con LINQ

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

Esto es lo que en última instancia, descubrí a solucionar mi problema con la no lambda LINQ cosas.

// 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 
} 

Lo que estoy realmente curioso acerca de si es la misma puede realizarse utilizando los métodos de extensión basados ​​Lambda fuera de IEnumerable genérico para lograr la misma cosa. Google me dice que puedo hacer algo como lo siguiente para lograrlo

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

Sin embargo si hago lo que me sale un error de ejecución cuando golpeo la instrucción foreach. El error me dice que al menos un objeto tiene que implementar IComparible, lo que puedo ver ya que estoy usando un tipo anónimo para el método .OrderBy().

Entonces, ¿hay alguna manera de lograr lo que quiero usando la forma Lambda?

+3

Si usted quiere saber lo que los "métodos fluidas" son correspondientes a cada posible expresión de consulta, la sección 7.15.2 de la especificación de lectura. –

+2

@Eric Lippert, hay una hoja de trucos de traducción de C# 3.0 Query Expression, escrita por Bart Desmet, que encontré muy útil como referencia rápida: http://bartdesmet.net/blogs/bart/archive/2008/08/30/ c-3-0-query-expression-translation-cheat-sheet.aspx. –

+0

posible duplicado de [Múltiple "ordene por" en LINQ] (http://stackoverflow.com/questions/298725/multiple-order-by-in-linq) – jrummell

Respuesta

416

Puede utilizar los métodos de extensión ThenBy y ThenByDescending:

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

Supongo que debería completar completamente la API antes de hacer la pregunta;) También parece que puedes encadenar sentencias .ThenBy() tantas veces como necesites. ¡Gracias de nuevo! – sdanna

+23

¿qué pasa con '.AndThen()' –

+61

'No .AndThen()!' –