2010-12-28 2 views
4

私のコードをより良くしたいです。最初の例を2番目の例に安全に書き換えることはできますか?SingleOrDefault()のベストプラクティス

IQueryable<PDF> pdfList = (from pdfobj in pdfDataContext.PDFs 
          where pdfobj.Id == pdfId 
          select pdfobj); 
if (pdfList.Count() > 0) 
{ 
    PDF pdfOldWay = pdfList.FirstOrDefault(); 
    pdfOldWay. // do something. (pdfOldWay can't be null here...) 
} 

-

PDF pdfNewWay = (from pdfobj in pdfDataContext.PDFs 
       where pdfobj.Id == pdfId 
       select pdfobj).SingleOrDefault(); 
if (pdfNewWay != null) 
{ 
    // do something 
} 

-

EDIT:明確にされていないため

申し訳ありません。私の問題は、最初にリストを使用することなくPDFオブジェクトを直接取得することです。私はカウントが0より大きく、ちょうど良く見えないので、チェックをしたくない。

+0

コードサンプルをスクロールする必要がないようにフォーマットすることができれば、特にスクロールされたコンテンツが非常に重要な場合は、本当に役立ちます。私は今それを編集するつもりですが、もしあなたがそれを将来自分自身でやることができれば、それは高く評価されます。 –

+0

申し訳ありません。確かに私は将来それをやるでしょう。 – radbyx

+0

「安全に」2番目のものが最初のものではない例外をスローするとはどういう意味ですか?安全は同じ機能を意味しますか?それとも何か他のことを示唆していますか? –

答えて

10

はい、安全です。あなたはまた、少しあなたのクエリを簡素化することができます:

PDF pdfNewWay = pdfDataContext.PDFs.SingleOrDefault(p => p.Id == pdfId); 
if (pdfNewWay != null) 
{ 
    // do something 
} 

SingleOrDefaultとFirstOrDefaultの唯一の違いは、複数の一致が見つかった場合は、このチェックをしない限り、あなたが同様に固執するようSingleOrDefaultは、例外がスローされますということですFirstOrDefault。

+0

要素が見つからない場合、singleも例外をスローします。 –

+0

@billal - not true – Denis

+0

@Denisいいえ、[それは本当です。](http://msdn.microsoft.com/en-us/library/bb155325(v=vs.110).aspx) 'SingleOrDefault'はスローしませんあなたは何を意味するのかもしれない例外ですか? –

0

はい、同じ結果が得られますが、問題はありません。

+0

最初のサンプルのFirstOrDefaultと2番目のサンプルのSingleOrDefaultの違いに注意してください。 –

6

SingleOrDefaultは2つ以上の項目がある場合に例外をスローするため、FirstOrDefaultを使用してください。それはあなたのために大丈夫ですか?

一方、いくつかのidに対してpdfobjectが1つしかないことを保証したい場合は、SignleOrDefaultを使用するよりも優れています。

+0

また、LINQ-To-Entityの場合は、SingleOrDefaultを使用できないことにも言及する価値があります。 –

+0

これも真です。それは私のコードを簡素化するのにも役立ちましたので、私は他の答えをマークしました。 – radbyx

3

常に0または1の行があることが保証されている場合は、SingleOrDefaultが最適なソリューションです。

+1

私たちのソリューションが超良いかどうかわかりません。しかし、私は最大1のインスタンスを保証することはできますが、SingleOrDefault()を使用します。引数はです。同じIDを持つインスタンスが複数ある場合は、間違い/エラーであり、例外をスローすることは通知されているので良いです。 – radbyx

+0

それに加えて、私はあなたに完全に同意します。 – radbyx

関連する問題