4

私はF#でLINQを学んでいます。lastOrDefaultの使い方を知りたい。ある日付を格納するDaysというSQLServerデータテーブルがある場合、テーブルの最後の日付を選択するクエリを記述します。レコードがない場合は、時刻00であるunixEpochを返します。 1970年1月1日の00:00UTC。

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エポックを返すことは、例外的なケースを処理する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 *)
于 2012-01-28T11:09:21.463 に答える