LINQ TO SQL Query - PullRequest
       6

LINQ TO SQL Query

4 голосов
/ 10 февраля 2010

У меня есть запрос LINQ TO SQL, который извлекает всех пользователей вместе с их ролями:

var userRoles = from u in db.GetTable<User>()
                            join ur in db.GetTable<UserRole>()
                                on u.UserID equals ur.UserID
                            join r in db.GetTable<Role>()
                                on ur.RoleID equals r.RoleID
                                orderby u.UserID
                            select new
                                       {
                                           u.UserID,
                                           r.RoleName
                                       };

Пользователь в системе может иметь несколько ролей. Результат этого запроса (в табличном формате) выглядит следующим образом:

1 Admin
1 сотрудник
2 сотрудника
3 сотрудника

Как мне переписать этот запрос, чтобы вернуть все роли пользователей в виде значений, разделенных запятыми, например:

1 Администратор, сотрудник
2 сотрудника
3 сотрудника

Ответы [ 2 ]

3 голосов
/ 11 февраля 2010

Привет, Кумар, я создал небольшое консольное приложение, чтобы имитировать данные, которые, я полагаю, у тебя есть. Я думаю, что это демонстрирует поведение, которое вы ищете, хотя. Это не самый лучший код в мире, но я думаю, что алгоритм - это главное. Я просто собрал быстрое переопределение ToString () для правильного отображения данных.

Основным изменением, которое я сделал, было создание определенного класса для отображаемых данных и разбиение запроса linq на две отдельные части:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Test
{
    class Program
    {
        static void Main()
        {
            var users = new List<User>
                            {
                                new User
                                    {
                                        UserID = "1"
                                    },
                                new User
                                    {
                                        UserID = "2"
                                    },
                                new User
                                    {
                                        UserID = "3"
                                    }
                            };

            var roles = new List<Role>
                            {
                                new Role
                                    {
                                        RoleID = "1",
                                        RoleName = "Admin"
                                    },
                                new Role
                                    {
                                        RoleID = "2",
                                        RoleName = "Employee"
                                    }
                            };

            var userRoles = new List<UserRole>
                                {
                                    new UserRole
                                        {
                                            UserID = "1",
                                            RoleID = "1"
                                        },

                                    new UserRole
                                        {
                                            UserID = "1",
                                            RoleID = "2"
                                        },

                                    new UserRole
                                        {
                                            UserID = "2",
                                            RoleID = "2"
                                        },

                                    new UserRole
                                        {
                                            UserID = "3",
                                            RoleID = "2"
                                        }
                                };

            var userRoles2 = from u in users
                             orderby u.UserID
                             select new UserList
                             {
                                 UserID = u.UserID,
                                 Roles = (from r in roles
                                            join ur in userRoles
                                            on u.UserID equals ur.UserID
                                            where ur.RoleID == r.RoleID
                                            select r).ToList()
                             };

            foreach (var item in userRoles2)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }

    public class User
    {
        public string UserID;
    }

    public class UserRole
    {
        public string UserID;
        public string RoleID;
    }

    public class Role
    {
        public string RoleID;
        public string RoleName;
    }

    public class UserList
    {
        public string UserID;
        public List<Role> Roles;

        public override string ToString()
        {
            string output = UserID + " ";
            foreach (var role in Roles)
            {
                output += role.RoleName + ", ";
            }
            output = output.Substring(0, output.Length - 2);
            return output;
        }
    }
}
2 голосов
/ 11 февраля 2010

Это один из способов сделать это, не проверял это:

    from u in db.GetTable<User>()   
                      join ur in db.GetTable<UserRole>()   
                            on u.UserID equals ur.UserID   
                      join r in db.GetTable<Role>()   
                            on ur.RoleID equals r.RoleID   
                      orderby u.UserID
                      group u by u.UserID into g    
                      select new   
                                {   
                                    UserId = g.Key,   
                                    Roles = String.Join (" ,", g.UserRoles.SelectMany(c => c.Roles).Select(p=> p.RoleName).ToArray()))
                                };   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...