F#LINQ lastOrDefault unix Epoch

时间:2012-01-28 10:30:46

标签: linq linq-to-sql f# query-expressions

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

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

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

谢谢, 约翰

1 个答案:

答案 0 :(得分: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#处理特殊情况的方式。如果数据表中没有记录,则返回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 *)