回答:
さまざまな方法の概要は次のとおりです。
Find()-主キーでアイテムを取得する場合。アイテムが見つからない場合はnullを返します。(コメントでYaronが指摘しているように)データベースに移動する前にコンテキストを調べます。これは、同じコンテキストが有効な間に同じエンティティを複数回取得する必要がある場合に重要な効率要素になる可能性があります。
Single()-クエリによって正確に1つのアイテムが返されることが期待される場合。これは、クエリが正確に1つのアイテムを返さない場合に例外をスローします。
SingleOrDefault()-クエリによってゼロまたは1つのアイテムが返されることが期待される場合(つまり、指定されたキーを持つアイテムが存在するかどうか不明)。クエリが0または1つのアイテムを返さない場合、これは例外をスローします。
First()-クエリによって1つ以上のアイテムが返されることが期待されているが、コード内の最初のアイテムのみにアクセスしたい場合(ここでのクエリでは順序が重要になる場合があります)。これは、クエリが少なくとも1つのアイテムを返さない場合に例外をスローします。
FirstOrDefault()-クエリから0個以上のアイテムが返されることを期待しているが、コードの最初のアイテムにのみアクセスしたい場合(つまり、指定されたキーを持つアイテムが存在するかどうか不明)
Sales.OrderByDescending(s => s.TotalValue).First();
Single
またはSingleOrDefault
2つのレコードをクエリする(制限2)First
かFirstOrDefault
、1 つをクエリする(制限1)ことです。
いつも使いがちFirstOrDefault
です。本当にパフォーマンスにこだわりたい場合はFirstOrDefault
、EFで使用する必要があります。カバーの下ではSingleOrDefault
、クエリでtop(2)を使用しています。これは、条件に一致する2番目の行があるかどうかを確認する必要があり、一致する場合は例外をスローするためです。基本的にSingleOrDefault
は、クエリが複数のレコードを返した場合に例外をスローする必要があると言っています。
FirstOrDefault
し、SingleOrDefault
有意であると?ほとんどの場合、それは時期尚早の最適化だと思います。
Single()
または1つしか存在しないはずのSingleOrDefault()
ものを返す場合。私がそうする理由は、正しく書かれていないクエリを作成してバグを見つけることです。少なくとも私の考えでは、これはシステム内のデータの一貫性を保つのに役立ちます。もちろん、これは遅くなりますが、それほど遅くはないと思います。私はその代金を払いたいと思っています。
非常に単純です。Single
単一のアイテムを返し、アイテムがないか、複数ある場合は例外をスローします。First
最初のアイテムを返すか、アイテムがない場合はスローします。FirstOrDefault
アイテムがない場合、最初のアイテムを返すか、デフォルト値(null
指定されたタイプが参照タイプの場合)を返します。
これは、APIが想定している動作です。ただし、基礎となる実装では動作が異なる場合があることに注意してください。Entity Frameworkはこれに従いますが、LLBLGenのようなO / RM はnull
呼び出し時にも戻ることができますFirst
が、これは非常に奇妙なことです。これは、デザイナーIMOによる非常に奇妙な(そして頑固な)決定でした。
Single
結果には1つの要素しかないと期待することを明確に表現しています。
4つの方法にはそれぞれ場所があります。実際には2つの異なる操作しかありません。
xxxxOrDefault()バージョンは、「空の結果セットを例外的な状況であると見なしたくない」と追加しただけです。
反対に、次のように、これらのメソッドをコアロジックで分割できます。
一部のパフォーマンスの詳細については、特に2番目のケースでは、こちらをご覧ください。https: //msdn.microsoft.com/en-us/data/hh949853.aspx?f = 255&MSPPError = -2147217396#3
さらに、最初のグループでは複雑なクエリを定義できますが、Find()メソッドを使用すると、検索にエンティティキーのみを提供できます。