【问题标题】:LINQ TO SQL QueryLINQ TO SQL 查询
【发布时间】:2010-02-10 20:41:28
【问题描述】:

我有一个 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 名员工

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:

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

      【讨论】:

        猜你喜欢
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 2015-05-22
        • 2012-05-16
        • 1970-01-01
        相关资源
        最近更新 更多