LINQ OrderBy 不同的字段类型取决于 IF 语句

Ale*_*scu 5 c# linq sorting

我正在尝试对一些可能处于以下(推断)状态之一(按此顺序)的数据进行排序:

  • live(有效StartDate,空EndDate);
  • draft(空StartDate);
  • ended(有效EndDate)。

我在 a 上继承了以下语法IQueryable

iQueryableData
    .OrderBy(t => t.StartDate == null ? 1 : (t.EndDate == null ? 0 : 2))
    .ThenByDescending(t => t.StartDate)
    .ThenBy(t => t.PartnerId)
Run Code Online (Sandbox Code Playgroud)

这很好,因为它根据某些IF语句对表的前 3 列之一进行排序。

现在我需要重写它以在不同(但相似)的模型上在内存中工作(所以只是LINQ,没有IQueryable)。以下是上述查询的大致翻译:

data
    .OrderBy(t => t.StartDate == null 
                      ? t.EndDate // DateTime
                      : (t.EndDate == null 
                            ? t.Id // integer
                            : t.Name // string
                        )
            )
Run Code Online (Sandbox Code Playgroud)

这显然无法编译,因为

CS0173 C# 条件表达式的类型无法确定,因为“int”和“string”之间没有隐式转换

据推测,我可以继续按整数排序,但我不知道在这种情况下数字会指什么(类中写入的属性顺序?按名称顺序排序?)。

不幸的是,我发现的所有与我的问题相关的问题都是基于IF依赖于外部值(而不是数据内部)的语句进行排序的。

小智 1

我建议您为您的数据实现一个比较器。CompareTo 方法将处理您可能遇到的一些复杂情况:如果 linq 必须比较日期、数字或字符串怎么办?