2010-07-20 50 views
1

如何擴大這個查詢:LINQ加入和組

public Dictionary<int, List<TasksInDeal>> FindAllCreatedTasks() 
{ 
    return (from taskInDeal in db.TasksInDeals 
      where taskInDeal.Date > DateTime.Now && taskInDeal.Date < DateTime.Now.AddDays(7) 
      group taskInDeal by taskInDeal.CreatedByUserID 
       into groupedDemoClasses 
       select groupedDemoClasses).ToDictionary(gdc => gdc.Key, gdc => gdc.ToList()); 
} 

弄成這個樣子:

public Dictionary<int, List<TaskForNotification>> FindAllCreatedTasks() 
{ 
    return (from taskInDeal in db.TasksInDeals 
      join user in db.Users on taskInDeal.CreatedByUserID equals user.UserID 
      where taskInDeal.Date > DateTime.Now && taskInDeal.Date < DateTime.Now.AddDays(7) 
      group taskInDeal by taskInDeal.CreatedByUserID 
       into groupedDemoClasses 
       select new TaskForNotification 
       { 
        Email = user.Email, 
        TaskInDealField1 = taskInDeal.TaskInDealField1, 
        TaskInDealField2 = taskInDeal.TaskInDealField2, 
        TaskInDealField3 = taskInDeal.TaskInDealField3, 
        ... 
       } 
       ).ToDictionary(gdc => gdc.Key, gdc => gdc.ToList()); 
} 

所以,首先查詢我需要從其他表連接電子郵件。

+0

簡單的問題 - 很難相信它坐了5個小時。 – 2010-07-20 14:40:02

回答

1
// do the date logic up front, not in the database. 
DateTime now = DateTime.Now 
DateTime weekFromNow = now.AddDays(7); 

    // pull the joined rows out of the database. 
var rows = 
(
    from taskInDeal in db.TasksInDeals 
    where taskInDeal.Date > now && taskInDeal.Date < weekFromNow 
    join user in db.Users 
    on taskInDeal.CreatedByUserID equals user.UserID 
    select new {TaskInDeal = taskInDeal, UserEmail = user.Email} 
).ToList(); 

    // shape the rows in memory 
Dictionary<int, List<TaskForNotification>> result = 
(
    from row in rows 
    let taskForNotification = new TaskForNotification 
    { 
    Email = row.UserEmail, 
    TaskInDealField1 = row.TaskInDeal.TaskInDealField1, 
    TaskInDealField2 = row.TaskInDeal.TaskInDealField2, 
    TaskInDealField3 = row.TaskInDeal.TaskInDealField3, 
    ... 
    } 
    group taskForNotification by row.TaskInDeal.CreatedByUserID 
    // without an "into", group by ends the query. 
).ToDictionary(g => g.Key, g => g.ToList()); 

當你分組時,牢記這一點。 SQL中的組只有鍵和聚合。 LINQ中的組擁有密鑰,聚合和元素!如果您向數據庫詢問組,然後詢問元素--SQL無法在單個查詢中爲您提供這些元素。您將使用該組的密鑰作爲過濾器自動結束重複查詢。

+0

謝謝大衛,這是有用的信息! – 2010-07-21 08:35:15