Linq, OrderByDescending, First, and the nefarious

2019-02-22 06:43发布

问题:

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?

回答1:

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();