在 OrderBy 实体框架中使用三元运算符

问题描述 投票:0回答:2

我见过类似下面的代码:

collection.OrderBy(x => x.StartDate == null ? 0 : 1).ThenBy(x => x.CreatedDate).To list();

我已经用谷歌搜索并搜索了这个网站,但找不到任何解释。通常我按属性名称按集合中的字段排序。

有人可以用简单的英语向我解释这是做什么的吗?我理解三元表示如果 StartDate 为空,则按 0 排序,否则按 1 排序。这对我来说没有意义。

谢谢。

c# entity-framework conditional-operator
2个回答
3
投票

本质上是按

CreatedDate
点餐,但是分两组。首先是
StartDate
null
的组,然后是
StartDate
不是
null
的组。

这创建了两个“组”:

.OrderBy(x => x.StartDate == null ? 0 : 1)

所以首先你有

StartDate
null
的所有记录,然后是所有不是
null
的记录。然后每个“组”内的二级顺序是
CreatedDate

.ThenBy(x => x.CreatedDate)

所以用简单的英语可以描述为:

显示所有没有

StartDate
的记录,按
CreatedDate
排序,然后是所有带有
StartDate
的记录,按
CreatedDate
排序。


2
投票

.OrderBy(x => x.StartDate == null ? 0 : 1)
将把没有
StartDate
的项目作为输出的第一个,基本上将集合“拆分”为两个“组”,然后对于每个“组”,通过
CreatedDate
应用
.ThenBy(x => x.CreatedDate)
的附加排序。

一些额外的注释 - 来自

IComparable
文档:

根据定义,任何对象比较大于(或遵循)

null
,并且两个空引用相互比较相等。

但是如果您实际上是在查询数据库 -

null
的顺序不是标准化的并且取决于数据库(例如,例如 AFAIK EF Core 通常会尝试翻译这些东西以便它们与 LINQ-to 一致-对象/运行时行为)但在这种情况下过于明确不应该受到伤害。

© www.soinside.com 2019 - 2024. All rights reserved.