4

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

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

如果数据表中没有记录,请告诉我如何返回 unixEpoch。

谢谢,约翰

4

1 回答 1

4

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#-ish 方式。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 *)
于 2012-01-28T11:09:21.463 回答