2010-06-23 6 views
1

J'ai 3 tables:LINQ to SQL et rejoindre problème

USER 
===== 
USER_ID(PK) 
FISRT_NAME 
LAST_NAME 
... 

ROLES 
====== 
ROLE_ID (PK) 
NAME 

USER_ROLES 
========== 
USER_ID(PK, FK) 
ROLE_ID(PK, FK) 

Je veux extraire toutes les données utilisateur et tous ses rôles (séparés par une virgule) en ligne unique.
Sometging comme ceci:

1 | John | Smith | Power user, Administrator 
2 | John | Doe | Guest 

Je ne sais pas comment faire. Merci de votre aide.

modifier:
J'ai essayé quelque chose comme ceci:

List<UserDTO> users = null; 

using (CarShopDataContext dc = DB.GetContext()) 
{ 
    users = (from u in dc.Users 
       select new UserDTO 
       { 
        UserId = u.UserId, 
        Username = u.Username, 
        FirstName = u.FirstName, 
        LastName = u.LastName, 
        Roles = "" 
       }).ToList(); 

    foreach (var user in users) 
    { 
     var roles = (from ur in dc.UserRoles 
         join r in dc.Roles on ur.RoleId equals r.RoleId 
         where ur.UserId == user.UserId 
         select r.Name).ToList(); 

     StringBuilder userRoles = new StringBuilder(); 
     for (int j = 0; j < roles.Count; j++) 
     { 
      userRoles.Append(roles[j]); 

      if (j < roles.Count - 1) 
       userRoles.Append(", "); 
     } 

     user.Roles = userRoles.ToString(); 
    } 
} 

return users; 

Répondre

0

serveur SQL n'a pas un opérateur global pour produire une liste CSV donc ce que vous voulez est probablement mieux réalisé en interrogeant les données obtenues avec LINQ -À-entités:

var rows = 
    (from u in context.User 
    join ur in context.UserRoles on u.User_ID equals ur.User_ID 
    join r in context.Roles on ur.Role_ID equals r.Role_ID 
    select new 
    { 
     FirstName = u.First_Name, 
     LastName = u.Last_Name, 
     RoleName = r.Name 
    }).AsEnumerable(); 

var roles = 
    from r in rows 
    group r by new {r.FirstName, r.LastName} into g 
    select new 
    { 
     FirstName = g.Key.FirstName, 
     LastName = g.Key.LastName, 
     Roles = g.Select(x => x.RoleName).Aggregate((x, y) => x + "," + y) 
    }; 
+0

J'utilise LINQ 2 SQL et je reçois une erreur sur la fonction globale: « Impossible de convertir l'expression lambda pour déléguer type « System.Func 'parce que certains des types de retour je n le bloc n'est pas implicitement convertible au type de retour délégué " –

+0

Voir la réponse mise à jour. Le précédent LINQ essayait d'effectuer la concaténation agrégée sur l'ensemble de l'objet anonyme - je lui ai maintenant demandé de simplement sélectionner le champ 'RoleName'. –