我正在用F#学习LINQ。我想知道如何使用lastOrDefault。
如果我有一个名为Days的SQL Server数据表,该表存储了一些日期,我想编写一个查询来选择表的最后日期,如果没有记录,我想返回unixEpoch,即时间00: 1970年1月1日世界标准时间00:00。

let lastDate =
    query {
          for day in days do
          lastOrDefault
          }


如果数据表中没有记录,请让我知道如何返回unixEpoch。

谢谢,
约翰

最佳答案

如果数据表不为空,则lastOrDefault运算符将在此处返回最后一个日期。否则,它将返回默认值DateTime,恰好是DateTime.MinValue

由于您不能更改此默认值,因此最好检查查询结果是否为默认值并返回查询之外:

let lastDate =
    let d =
       query {
               for day in days do
               lastOrDefault
          }
    if d = DateTime.MinValue
    then new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
    else d


但是,返回Unix Epoch并不是处理异常情况的F#方式。如果数据表中没有记录,则返回None更加清晰,并且处理此option值以应对意外情况也更容易:

let lastDate =
    let d =
       query {
               for day in days do
               lastOrDefault
          }
    if d = DateTime.MinValue then None else Some d

match lastDate with
| None -> (* Process the exceptional case *)
| Some d -> (* Do something with d *)

10-08 02:41