LINQ左外部连接w /右表上的日期范围限制?

问题描述:

我有两张表,一张LP_task表和一张lp_Update表。我想要一个完整的任务列表,并且只需要在特定日期范围内发布的更新。 LINQ似乎不支持任何其他连接标准,但“等于”或每个任务。即使他们没有更新,我也想要所有的任务(左表)。 (左外连接)LINQ左外部连接w /右表上的日期范围限制?

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子句都会这样做。不知道从这里做什么。

您可以在连接中拥有嵌套查询。所以你可以加入一个过滤表格。下面是如何在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

完美!我感到很傻,我忽略了LINQ的一个关键特性。另外感谢您展示Lambda表达式格式,我没有看到太多人在VB.NET中做这些 – TheDPQ 2011-02-08 00:22:59