Linq, сначала убывающий порядок и гнусный DefaultIfEmpty

#c# #linq #linq-to-entities #defaultifempty

#c# #linq #linq-to-entities #defaultifempty

Вопрос:

Надеюсь, это просто потому, что я не понимаю чего-то базового. Ниже приведены два оператора 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();
  

сущности.Periods — это набор, содержащий два объекта Period, каждый с a unique UID .

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

Однако в моей среде это не так.

значение p1 правильное (т. е. Оно равно объекту Period с наибольшим UID в наборе).

однако значение p2 неверно (т. Е. Равно другому периоду в наборе).

Есть идеи?

Ответ №1:

DefaultIfEmpty() в Linq для сущностей не гарантируется поддержание порядка, установленного OrderByDescending() , (также см. here) порядок всегда должен быть последним, и именно поэтому первый случай работает — но, на мой взгляд, вы не должны использовать ни то, ни другое — это именно то, что FirstOrDefault() для:

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