Linq,OrderByDescending,First,以及邪恶的DefaultIfEmpty

时间:2011-09-30 19:36:45

标签: 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();

entities.Periods是一个包含两个Period对象的集合,每个对象都有unique UID

根据我理解的一切,p1和p2应该是相同的。

然而,在我的环境中,他们不是。

p1是正确的(即它等于集合中具有最大UID的Period对象)。

然而,

p2不正确(即它等于集合中的其他句点)。

有什么想法吗?

1 个答案:

答案 0 :(得分:8)

Linq to Entities上的

DefaultIfEmpty()不保证维持OrderByDescending()建立的顺序,(也见here)订单应该始终是最后一次,这就是为什么第一个案例有效 - 但在我看来你不应该使用 - 这正是FirstOrDefault()的用途:

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