2011-02-04 26 views
3

私はLP_taskテーブルとlp_Updateテーブルの2つのテーブルを持っています。私は、タスクの完全なリストと、特定の日付範囲内に掲示された更新のみが必要です。 LINQは他の結合基準をサポートしているようには見えませんが、それぞれのタスクと「等しく」なります。更新がない場合でも、すべてのタスク(左のテーブル)が必要です。 (左外部結合)LINQ左外部結合、右テーブルの日付範囲制限?

Dim TasksData = (From t In db.LP_Tasks _    
      Group Join up In db.LP_Updates On t.ID Equals up.TaskID Into upds = Group _ 
      From u In upds.DefaultIfEmpty _ 
      Order By t.TaskOrder, t.TaskNote, u.DateCreated Descending _ 
      Select New With {t.ID, t.TaskNote, u.UpdateNote, u.DateCreated}) 

これは、すべてのLP_taskとそれぞれのLP_updateを取得するのに最適です。更新が利用できない場合でも、タスクは返されます(左外部結合)

ここでは、特定の日付範囲の更新を制限したいと考えています。私は更新を含むが、日付の要件を満たすために失敗したすべてのタスクを左側から取ることなくこれを行う方法を見ることができません。 WHERE句を追加すると、upds.DefaultIfEmptyがそれを行います。ここから何をすべきか分かりません。

答えて

1

結合でネストされたクエリを使用できます。だから、フィルタリングされたテーブルに参加することができます。ここでは、C#で、このようなクエリを書くことができます方法は次のとおりです。

// broken up for readability 
var tenYearsAgo = DateTime.Now.AddYears(-10); 
var filtered = db.LP_Updates.Where(up => up.DateCreated > tenYearsAgo); 
var query = from t in db.LP_Tasks 
      join up in filtered on t.ID equals up.TaskID into upds 
      from u in upds.DefaultIfEmpty() 
      orderby t.TaskOrder, t.TaskNote, u.DateCreated descending 
      select new { t.ID, t.TaskNote, u.UpdateNote, u.DateCreated }; 

とVBと同等:

Dim tenYearsAgo = DateTime.Now.AddYears(-10) 
Dim filtered = db.LP_Updates.Where(Function(up) up.DateCreated > tenYearsAgo) 
Dim query = From t In db.LP_Tasks            _ 
      Group Join up In filtered On t.ID Equals up.TaskID Into upds = Group _ 
      From u In upds.DefaultIfEmpty          _ 
      Order By t.TaskOrder, t.TaskNote, u.DateCreated Descending   _ 
      Select t.ID, t.TaskNote, u.UpdateNote, u.DateCreated 
+0

PERFECT!私はLINQの重要な機能の1つを無視していると馬鹿げています。また、ラムダ式の形式を見せてくれてありがとう、私はあまりにも多くの人々がVB.NETでそれらを行うことはありません – TheDPQ

関連する問題