LINQ присоединиться и группа - PullRequest
1 голос
/ 20 июля 2010

Как развернуть этот запрос:

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());
}

Итак, для первого запроса мне нужно присоединиться к электронной почте из другой таблицы.

1 Ответ

1 голос
/ 20 июля 2010
  // 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 не сможет предоставить вам эти элементы в одном запросе. Вы автоматически будете повторно запрашивать, используя ключ группы в качестве фильтра.

...