2

linqクエリを作成する一般的な方法について質問があります。実際、私は同僚と議論を交わしました。

trueの場合に備えて、ブール変数があります。追加のチェックが必要です。それが偽の場合、そのようなチェックはないはずです。

linqで実装する方法は2つあります。

bool onlyForReturningCustomers;    
.....    
return context.Products.Where(product => product.StartTime >= fromDate 
                                && product.StartTime < toDate 
                                && (onlyForReturningCustomers ? product.IsReturningClient : true));

そして2番目:

bool onlyForReturningCustomers;
.....            
var q = context.Products.Where(product => product.StartTime >= fromDate && product.StartTime < toDate);

if (onlyForReturningCustomers) {
  q = q.Where(product => product.IsReturningClient);
}
return q;

case最初のものはSQLでステートメントをレンダリングしonlyForReturningCustomers=false、のようなステートメントが表示され1=1ますが、このコードははるかに読みやすくなっています。

2つ目はそれほど読みやすいものではありませんが、SQLでジャンクなしで明確なステートメントをレンダリングします。

どちらを使いますか?

4

3 に答える 3

4

2番目のステートメントは読みやすく、また、リピーターや他のタイプの顧客のために将来ビジネスルールを追加する場合は維持しやすくなります。

于 2012-04-05T09:36:10.143 に答える
4

私は行くかもしれません

bool onlyForReturningCustomers;
.....            
// Make a positively-named variable
bool includeAllCustomers = !onlyForReturningCustomers;
var q = context.Products.Where(product => product.StartTime >= fromDate 
                                       && product.StartTime < toDate
                                       && (includeAllCustomers 
                                           || product.IsReturningClient));

return q;

これは基本的に最初の方法と同じですが、1 つのブランチがtrue.

于 2012-04-05T09:29:26.377 に答える
0

2 番目のオプションは、実際にはデータへの 2 回の往復であるように見えるため、最初のオプションを使用します。

また、LINQ ステートメントによって発行された SQL をコピーして、お気に入りの SQL ツール(SQL Server Management Studio など)SET STATISTICS IO ONに貼り付け、ステートメントの上に追加SELECTし、クエリの実行に必要な論理読み取りを調べます (低いほど良い)。

于 2012-04-05T09:33:27.417 に答える