2011-09-30 12 views
6

Espero que esto sea una simple cuestión de que no entiendo algo básico. A continuación hay dos declaraciones Linq de una aplicación en la que estoy trabajando.Linq, OrderByDescending, Primero, y el infame DefaultIfEmpty

EDMXModel.Classes.Period p1 = entities.Periods.DefaultIfEmpty(null).OrderByDescending(ap => ap.UID).First(); 

EDMXModel.Classes.Period p2 = entities.Periods.OrderByDescending(ap => ap.UID).DefaultIfEmpty(null).First(); 

entities.Periods es un conjunto que contiene dos objetos de época, cada uno con un unique UID.

De acuerdo con todo lo que entiendo, p1 y p2 deben ser iguales.

En mi entorno, sin embargo, no lo son.

p1 es correcto (es decir, es igual al objeto Período con el UID más grande en el conjunto).

p2, sin embargo, no es correcto (es decir, es igual al otro Período en el conjunto).

¿Alguna idea?

Respuesta

8

DefaultIfEmpty() en LINQ a Entidades no garantiza para mantener el orden establecido por OrderByDescending(), (véase también here) el orden debe ser siempre la última y es por eso que el primer caso funciona - pero no se debe utilizar ya sea en mi opinión - Esto es exactamente lo que FirstOrDefault() es para:

EDMXModel.Classes.Period p1 = entities.Periods 
             .OrderByDescending(ap => ap.UID) 
             .FirstOrDefault(); 
Cuestiones relacionadas