1. ホーム
  2. c#

LINQを介して時間なしでDateTimeを比較する方法は?

2023-10-19 17:45:59

質問

私は

var q = db.Games.Where(t => t.StartDate >= DateTime.Now).OrderBy(d => d.StartDate);

の時間部分を含めて比較しています。 DateTime . 本当に必要ない。

時間がなくてもできる方法とは?

ありがとうございます。

どのように解決するのですか?

単に Date プロパティを使用します。

var today = DateTime.Today;

var q = db.Games.Where(t => t.StartDate.Date >= today)
                .OrderBy(t => t.StartDate);

を明示的に評価したことに注意してください。 DateTime.Today 一度だけ で、クエリの一貫性が保たれます。そうでなければ、クエリが実行されるたびに、さらに 内で を実行するたびに Today が変わる可能性があり、一貫性のない結果を得ることになります。例えば、以下のようなデータがあったとします。

Entry 1: March 8th, 8am
Entry 2: March 10th, 10pm
Entry 3: March 8th, 5am
Entry 4: March 9th, 8pm

確かに どちらも のエントリが結果に含まれるはずで、あるいは どちらも のどちらにも該当しないはずです。 DateTime.Today を評価し、それが が変化する を 3 月 9 日に変更した場合、エントリ 1、2、4 が表示される可能性があります。

もちろん DateTime.Today の中の日付に興味があることを仮定しています。 ローカル の日付に興味があると仮定しています。これは適切ではないかもしれません。 は絶対に を確認する必要があります。あなたは かもしれない を使いたい DateTime.UtcNow.Date を使いたいかもしれません。残念ながら DateTime は滑りやすい獣で ...

編集: また、以下の呼び出しを削除することもできます。 DateTime への呼び出しを完全に取り除くこともできます。これはコードのユニットテストを困難にします。 野田時間 では、この目的のために特別なインタフェースがあります ( IClock ) があり、適切に注入されることが期待されます。本番用の実装として "system time" があり、テスト用の実装として "stub" がありますが、自分で実装することもできます。

もちろん、Noda Timeを使わなくても、同じアイデアを使うことができます。この特定のコードの部分をユニットテストするために、あなたは日付を渡したいかもしれませんが、あなたはそれを どこか - から取得することになり、時計を注入することで をすべて をテストすることができます。