Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linq, OrderByDescending, First, and the nefarious DefaultIfEmpty

Hopefully this is a simple matter of me not understanding something basic. Below are two Linq statements from an application I'm working on.

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 is a set containing two Period objects, each with a unique UID.

According to everything I understand, p1 and p2 should be the same.

In my environment, however, they are not.

p1 is correct (i.e. it is equal to the Period object with the largest UID in the set).

p2, however, is not correct (i.e. it is equal to the other Period in the set).

Any ideas?

like image 645
AEberhard Avatar asked Sep 30 '11 19:09

AEberhard


1 Answers

DefaultIfEmpty() on Linq to Entities does not guarantee to maintain the order established by OrderByDescending(), (also see here) the order should always be last and that is why the first case works - but you shouldn't use either in my opinion - this is exactly what FirstOrDefault() is for:

EDMXModel.Classes.Period p1 = entities.Periods
                                      .OrderByDescending(ap => ap.UID)
                                      .FirstOrDefault();
like image 125
BrokenGlass Avatar answered Sep 21 '22 02:09

BrokenGlass