2010-07-20 2 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 часов. –

ответ

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

Спасибо, Дэвид, это была полезная информация! –

Смежные вопросы