2013-08-27 7 views
5

私はどこをなくし、次のようにそれを書き換えることができ、次のコード.Singleまたは状態またはWhere句

return 
    this.Storage.Customer.OfType<Preferred>() 
    .Include(b => b.Order) 
    .Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType) 
    .SingleOrDefault(); 

を持っているとデフォルト。

return 
    this.Storage.Customer.OfType<Preferred>() 
    .Include(b => b.Order) 
    .SingleOrDefault(cust => cust.Id == customerId && cust.CustomerType == (int)cusType); 

これはどちらが良い習慣であり、なぜですか?

+7

生成された「SQL」クエリは同じになりますので、私はあなたの意見はより良いと言います。 – MarcinJuraszek

+1

2番目の方が短くて読みやすいです。 –

+3

最初のコードはステップバイステップのコードに従っており、展開/デバッグが簡単だと思います。 –

答えて

1

まずあなたは違いを理解する必要が

this.Storage.Customer.OfType<Preferred>() 
.Include(b => b.Order) 
.Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType) 

これは単にクエリを作成しますが、ToListメソッドを呼び出すまで実行されません。

SingleOrDefaultメソッドは実際にクエリを実行します。クエリが実行される前にクエリをチェックしたり実行したりする場合は、whereを使い、SingleOrDefaultを呼び出す必要があります。

ので、全体的に、どこ使用することは私の個人的な意見あたり

2

関数の戻り値をデバッグの複雑さ、およびデバッガでラムダ式を使用することの不可能性のおかげで、これが最善の方法です:例外は上がある場合に、このように

var temp = this.Storage.Customer.OfType<Preferred>() 
    .Include(b => b.Order) 
    .Where(cust => cust.Id == customerId && cust.CustomerType == (int)cusType); 

return temp.SingleOrDefault(); 

SingleOrDefault()(あなたは複雑な表情をしている場合は、非常に一般的な何かが)、あなたはreturnにブレークポイントを入れて、時計のパネルで行うことができます。すべてのtemp.ToList();

+3

すべての点を尊重し、これは意見です。 – Maarten

+1

@Maarten私はそれを直接体験と呼んでいます:-)私のコードは、OPが提案する2つのバージョンよりも優れています。なぜなら、私のコードは検証可能な利点があるからです。結果のコードは、OPの1つ(ILレベルで)と等価/ほぼ同等です。これは等しく読みやすく、デバッグが容易です。 – xanatos

0

旧ポストとして良い習慣であり、これは主に意見ベースであるが、ここでは上記のではない別の考慮事項があります:

SingleOrDefault句をすることはできません上記のPatelが指摘したように、実際にはクエリを実行するため、Selectのような他の用語が続きます。たとえば、あなただけの顧客の名前を返すようにクエリを変更したいの道を言う:

this.Storage.Customer.OfType<Preferred>() 
.Include(b => b.Order) 
.SingleOrDefault(cust => cust.Id == customerId && cust.CustomerType == (int)cusType) 
.Select(cust=>cust.Name); //compile error 

は動作しませんし、その後IdCustomerTypeので、あなたはSingleOrDefault前にSelect句を移動することはできませんフィールドは、SingleOrDefaultのラムダ式には表示されません。代わりに、あなたは最初Where句を再度追加する必要があるでしょう:

したがって ​​

Where句がしばしば必要であり、常に少なくとも同じ良好なパフォーマンスので、おそらく常に一貫性、読みやすさのためにそれを使用することをお勧めしますメンテナンス性。

関連する問題