我有两个表,一个 LP_task 表和一个 lp_Update 表。我想要一个完整的任务列表,只需要在特定日期范围内发布的更新。 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_tasks及其各自的LP_updates。如果没有可用的更新,它仍然返回任务(左外连接)
现在我想将更新限制在某个日期范围内。如果没有从左侧执行包括更新但未能满足日期要求的所有任务,我无法看到如何执行此操作。我在upds.DefaultIfEmpty之后添加的任何WHERE子句都会这样做。不知道该怎么做。
答案 0 :(得分: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