2012-04-05 7 views
2

linqクエリを書く一般的な方法について質問があります。実際、私は同僚と議論しました。Linqコーディングスタイル:インラインの場合

真の場合にブール変数があります。追加チェックが必要です。それが間違っている場合には、そのようなチェックはありません。

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

と第二::

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

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

最初のものは、SQLでcase声明をレンダリングしたときにonlyForReturningCustomers=false1=1現れのようなステートメントが、これを

は2 LINQでそれを実装する方法がありますコードははるかに簡単に読み込まれます。

2番目の文字は読みにくいですが、迷惑メールなしでsqlに明瞭な文が表示されます。

どちらを使用しますか?

+2

あなたはすでにこれに答えるためのツールや知識があるようです。 –

答えて

3

私は基本的にあなたの最初の方法と同じであるが、一方の枝だけでtrueを言う条件式の風変わりなし

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; 

のために行くかもしれません。

+0

なぜあなたはしなかったのですか(!onlyForReturningCustomers || product.IsReturningClient)?変数を使用して保存します。 – mattytommo

+0

@mattytoを文体的なものとして使用すると、私は表現する/消費する論理的な条件を好感します**私は理解を助けると信じています。私はコードコンプリートでこれにいくつかのものがあると思う(申し訳ありませんが、今すぐ手にする必要はありません) – AakashM

+0

ああ、十分に、私はそれに同意する:)。あなたの答えは+1 – mattytommo

0

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

私はまた、LINQ文によって放出されたSQLをコピーお気に入りのSQLツール(例えばSQL Server Management Studioの)に貼り付け、SELECT声明の上SET STATISTICS IO ONを追加し、(論理的には、クエリを実行するために必要な読み込み調べます低い方が良い)。

+3

2回の往復は必要ありません.LINQクエリは、実際に結果を求めるまで延期されます。 – LukeH

4

2番目のステートメントは、顧客または他のタイプの顧客を返すためにビジネスルールを将来追加する場合、読みやすく、保守が簡単です。

関連する問題