2010-07-20 87 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