2011-02-05 22 views
0

私はタスクテーブルを持っています。私が何をしたいかアクティブなタスクと最近完了したタスクを選択します。

PK TaskId 
     TaskName 
     Notes 
     ... 
     ... 
    FK StatusId 
     DateCompleted 

は最後の7日間で完成プラス任意のタスクアクティブなタスク場合は、リストを取得することです。

現在私は持っています。

var then = DateTime.Today.AddDays(-7); 
return _db.Tasks 
    .Where(t => (t.StatusId != 1)) 
    .Union(_db.Tasks 
    .Where(t => (t.DateCompleted >= then)) 
    ); 

これは最も賢明な方法ですか?それがより良い方法に合わせて変更することができますので、私は最初からDBを作成しています:)

乾杯 Siの

答えて

0

他の代替である:

var day = DateTime.Today.AddDays(-7); 
return _db.Tasks 
    .Where(t => t.StatusId != 1 || t.DateCompleted >= day); 

これは、より簡潔であるが、単一のインデックス(StatusId又はDateCompletedいずれか)を使用することができます。 Union技術では両方のインデックスを使用できますが、重複する可能性があります。

解決策を改善するには、2セット間に重複がないことが確かであれば、Union()の代わりにConcat()を使用して重複を排除することができます。 Concat()UNIONより速いUNION ALLになります。

+0

ありがとうございますssg&Matti。このアプリケーションの速度は本当に問題にはならないでしょうが、これは私よりも洗練されたソリューションです:) LinqPadの結果SQLはあまりにもぎりぎりです! –

0

は、データベース自体はOKと思われる、あなただけの単純な「または」クエリでは使用できませんでした?

_db.Tasks.Where(t => t.StatusId != -1 || t.DateCompleted >= then) 
関連する問題