代码之家  ›  专栏  ›  技术社区  ›  David.Warwick

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

  •  0
  • David.Warwick  · 技术社区  · 3 年前

    我看到了与以下代码类似的代码:

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

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

    有人能用通俗易懂的英语向我解释一下它的作用吗。我理解三进制是指如果StartDate为null,则按0排序,否则按1排序。这对我来说没有意义。

    谢谢

    2 回复  |  直到 3 年前
        1
  •  3
  •   David    3 年前

    基本上是按 CreatedDate ,但分为两组。第一组 StartDate 是 null ,然后是其中的组 起始日期 不是 无效的 。

    这将创建两个“组”:

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

    所以首先你有所有的记录 起始日期 是 无效的 ,然后是所有没有的记录 无效的 。则每个“组”中的次要顺序为 创建日期 以下为:

    .ThenBy(x => x.CreatedDate)
    

    因此,用通俗的英语来说,它可以被描述为:

    显示所有没有的记录 起始日期 ,排序依据 创建日期 ,然后是带有的所有记录 起始日期 ,排序依据 创建日期 。

        2
  •  2
  •   Guru Stron    3 年前

    .OrderBy(x => x.StartDate == null ? 0 : 1) 将放置没有 StartDate 首先在输出中基本上将集合“拆分”为两个“组”,然后对每个“组”进行额外排序 CreatedDate 通过应用 .ThenBy(x => x.CreatedDate) 。

    一些额外的笔记-来自 IComparable 文档:

    根据定义,任何对象的比较都大于(或跟随) null ,并且两个空引用比较起来彼此相等。

    但是,如果您实际查询的是一个数据库,则顺序为 无效的 的不是标准化的,依赖于数据库( for example ,例如,AFAIK EF Core通常会尝试翻译这些东西,使其与LINQ到对象/运行时行为一致),但在这种情况下过于明确应该不会有什么坏处。