2010-07-20 6 views
1

Comment développer cette requête:LINQ et rejoindre le groupe

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

en quelque chose comme ceci:

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

Ainsi, pour la première requête je dois rejoindre les emails des autres table.

+0

Question facile - difficile à croire, il a duré 5 heures. –

Répondre

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

Lorsque vous regroupez, gardez cela à l'esprit. Les groupes dans SQL ont uniquement des clés et des agrégats. Les groupes dans LINQ ont des clés, des agrégats et éléments! Si vous demandez des groupes à la base de données, puis demandez les éléments - SQL ne peut pas vous fournir ces éléments dans une seule requête. Vous finirez automatiquement par ré-interroger plusieurs fois en utilisant la clé du groupe comme filtre.

+0

Merci David, c'était une information utile! –