LINQ TO SQL查询

4
我有一个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 管理员
1 员工
2 员工
3 员工

我该如何重新编写此查询,以逗号分隔的形式返回所有用户角色,例如:

1 管理员,员工
2 员工
3 员工

2个回答

3
嘿,Kumar,我创建了一个小型控制台应用程序来模拟我认为你拥有的数据。我认为它展现了你寻找的行为。虽然这不是世界上最好的代码,但我认为算法才是重点。我只是快速地覆盖了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
这是一种方法,尚未测试:

这是一种方法,尚未测试:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接