は、「それは最初にすべてのデータベースの行を選択し、1でしょう」
技術を、いや、.SingleOrDefault続く.Selectの組み合わせは、それを行うことはありません。 Select()はクエリのパラメータを設定しますが、実際にはデータをフェッチしません。 LINQの遅延実行では、実際にデータ結果を生成する必要が生じるまで、行がフェッチされません。複数のクエリを一緒に構成する(.Select(...)、Select(..)など)、First()や.ToList()などのデータを返す操作を実行するまでは、実際には何も行をフェッチしません。
ただし、Single()を使用すると、一致する行が唯一の一致する行であることを証明するためにデータセット全体をスキャンすることがあります。
考えてみましょう:1行が一致するデータセット内のの行だけです。次の行を見つけようとする必要があります。実際にデータセット内の何百万ものものと一致する行が1つしかない場合、現在の一致が唯一の一致であることを証明するために、Single()はそれらの何百万もの行すべてを実行する必要があります。
データセットがSQLで、クエリの最適化を可能にする方法でデータのインデックスが作成されている場合、Single()はそれほど悪くない可能性があります。しかし、あなたのSQLデータがこのクエリに役立つ方法で索引付けされていない場合、Single()はSQLサーバーのために多くの作業を作成する可能性があります。
プログラムロジックが、返された行がデータセット全体の中の唯一の行であることを実際に知る必要がある場合は、Single()が適切です。ただし、一意性を保証する他の方法もあります。 LINQ条件に一致するデータにプライマリキーを設定できる場合、最初に一致する行が1つだけ存在するかデータベースに追加されるため、実際にはSingle()は必要ありません。 (主役のインデックスを使ってクエリを最適化できるため、皮肉なことに、この場合でもSingle()のパフォーマンスは非常に速くなります)
条件に一致する最初の行だけが必要な場合は、First )をSingle()の代わりに使用します。 First()は最初の一致が見つかるまで、データの行をスキャンするだけです。 Single()のように最初の一致が唯一の一致であることを証明するために行をスキャンし続ける必要はありません。
ありがとうございます。私はfirstordefaultを使用していますが、質問をするとどうにか忘れてしまいます。 –
私はFirstOrDefault()も提案しようとしていました。 –