Linq, OrderByDescending, First и гнусный DefaultIfEmpty - PullRequest
6 голосов
/ 30 сентября 2011

Надеюсь, это простой вопрос о том, что я не понимаю чего-то базового. Ниже приведены два оператора Linq из приложения, над которым я работаю.

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

entity.Periods - это набор, содержащий два объекта Period, каждый из которых имеет unique UID.

В соответствии со всем, что я понимаю, p1 и p2 должны быть одинаковыми.

В моем окружении, однако, это не так.

p1 является верным (то есть он равен объекту Period с наибольшим UID в наборе).

p2, однако, неверен (т. Е. Он равен другому Периоду в наборе).

Есть идеи?

1 Ответ

8 голосов
/ 30 сентября 2011

DefaultIfEmpty() в Linq to Entities не гарантирует сохранение порядка, установленного OrderByDescending(), (см. Также здесь ), порядок всегда должен быть последним, и поэтому первый случай работает, ноВы не должны использовать, по моему мнению, это именно то, что FirstOrDefault() для:

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