F # LINQ lastOrDefault unix Epoch - PullRequest
       20

F # LINQ lastOrDefault unix Epoch

4 голосов
/ 28 января 2012

Я учусь LINQ с F #. Я хочу знать, как использовать lastOrDefault. Если у меня есть таблица данных SQL Server с именем Days, в которой хранится некоторая дата, я хочу написать запрос для выбора последней даты таблицы, если записи нет, я хочу вернуть unixEpoch, то есть время 00: 00:00 UTC 1 января 1970 года.

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

Дайте мне знать, как вернуть unixEpoch, если в таблице данных нет записи.

Спасибо, John

1 Ответ

4 голосов
/ 28 января 2012

Оператор 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 *)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...