Linq to sql и присоединиться к проблеме - PullRequest
1 голос
/ 23 июня 2010

У меня есть 3 таблицы:

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

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

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

Я хочу извлечь все данные пользователя и все его роли (через запятую) в одну строку.
Примерно так:

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

Я не знаю, как это сделать. Спасибо за вашу помощь.

изменить:
Я пробовал что-то вроде этого:

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;

1 Ответ

0 голосов
/ 23 июня 2010

SQL-сервер не имеет какого-либо оператора агрегирования для создания списка CSV, поэтому то, что вы хотите, вероятно, лучше всего достигается путем запроса результирующих данных с помощью Linq-To-Entities:

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)
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...