【问题标题】:MongoDB Ordering Nullable Types With C# Linq DriverMongoDB 使用 C# Linq 驱动程序对可空类型进行排序
【发布时间】:2014-01-24 11:37:43
【问题描述】:

我正在使用 MongoDB C# Linq 驱动程序对搜索结果进行排序,以便在屏幕上的列表中显示。我希望能够按值可以为空的列排序,但始终在底部显示空值。这可以通过以下代码将 Linq 与内存中的集合一起使用:

items.OrderByDescending(d => d.AppointmentTime.HasValue).ThenBy(d => d.AppointmentTime);

但是,当我尝试使用 MongoDB C# 驱动程序执行此操作时,出现异常:

NotSupportedException: Unable to determine the serialization information for the expression: (d.AppointmentTime.HasValue).

我尝试使用 != null 而不是 HasValue,但这也不起作用。有没有办法说服 mongo 以这种方式缺少价值来订购?

编辑:应该说这是一个日期时间?我们正在处理的值。我试过了

items.OrderByDescending(d => d.AppointmentTime ?? DateTime.MinValue) 

但这会产生类似的 NotSupportedException。

【问题讨论】:

  • 如果你尝试这个会发生什么? items.OrderByDescending(d => d.AppointmentTime ?? 0)
  • 那甚至无法编译 - AppointmentTime 是一个 DateTime 对象,所以?? 0 是比较 DateTime 和一个 int。对不起,也许应该说清楚。顺便说一句,我试过了?? DateTime.MinValue,同样的 NotSupportedException
  • 啊,由于 AppointmentTime 的名称,我认为它可能是一个 int。您是否尝试过 items.OrderByDescending(d => d.AppointmentTime) 并看到没有进行空检查的结果?
  • 是的,我已经尝试过了——它的工作方式符合您的预期。当您订购降序时,它会按日期顺序下降,底部有空值(很好),但是当您执行逆序和升序时,您会得到顶部的空值和底部的实际值 - 我希望空值始终位于底部和实际日期按升序或降序排列的结果。
  • 我认为这是不可能的。但是,您可以首先仅查询空文档,然后使用 orderBy 查询其他文档

标签: c# linq mongodb sorting nullable


【解决方案1】:

您使用的 LINQ 语句实际上已转换为查询并发送到 mongod。您得到的例外是因为 mongod 没有可空类型的概念。如果您查看 MongoDB 文档 (http://docs.mongodb.org/manual/reference/bson-types/),您会注意到 mongod 只知道字段为空。但它只知道当针对该字段执行查询时,该字段对于文档为空。因此,空字段总是排在其他所有字段的下方。

您可以在mongod 中执行排序,也可以在客户端的内存中执行它。 要使用 {{mongod}} 进行排序,您应该能够简单地:

items.Where(x => x.Bar == "foo").ToArray().OrderByDescending(x => x.Widget);

为了确保它在内存中排序,必须首先执行查询。这可以通过强制.ToArray() 或类似的东西来完成。因此,您可以通过执行以下操作将所有这些链接在一起:

items.Where(x => x.Bar == "foo").ToArray().OrderByDescending(x => x.Widget.HasValue).ThenBy(x => x.Widget.Value);

如果可能的话,我建议不要在客户端进行内存排序。如果您的 where 子句没有足够的限制性,您最终可能会通过网络将大量数据传输到客户端。最好的情况是,这需要时间——最坏的情况是客户端因资源不足而崩溃。

【讨论】:

    猜你喜欢
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2016-11-16
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多