Linq to sql LINQ到SQL查询
我有一个LINQ TO SQL查询,它检索所有用户及其角色:Linq to sql LINQ到SQL查询,linq-to-sql,Linq To Sql,我有一个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
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
};
var userRoles=来自db.GetTable()中的u
在db.GetTable()中加入ur
在u.UserID上等于ur.UserID
在db.GetTable()中加入r
关于ur.RoleID等于r.RoleID
orderby u.UserID
选择新的
{
u、 用户ID,
r、 罗兰胺
};
系统中的用户可以有多个角色。此查询的结果(以表格格式)如下所示:
1管理员1名员工
2名员工
3名员工 如何重新编写此查询以将所有用户角色作为逗号分隔的值返回,如: 1名管理员、员工
2名员工
3名员工嘿,库马尔,我创建了一个小型控制台应用程序来模拟我相信你拥有的数据。我认为它展示了你想要的行为。这不是世界上最伟大的代码,但我认为算法才是关键。我刚刚对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;
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
名称空间测试
{
班级计划
{
静态void Main()
{
var users=新列表
{
新用户
{
UserID=“1”
},
新用户
{
UserID=“2”
},
新用户
{
UserID=“3”
}
};
var角色=新列表
{
新角色
{
RoleID=“1”,
RoleName=“Admin”
},
新角色
{
RoleID=“2”,
RoleName=“员工”
}
};
var userRoles=新列表
{
新用户角色
{
UserID=“1”,
RoleID=“1”
},
新用户角色
{
UserID=“1”,
RoleID=“2”
},
新用户角色
{
UserID=“2”,
RoleID=“2”
},
新用户角色
{
UserID=“3”,
RoleID=“2”
}
};
var userRoles2=来自用户中的u
orderby u.UserID
选择新用户列表
{
UserID=u.UserID,
角色=(来自角色中的r)
加入用户角色
在u.UserID上等于ur.UserID
其中ur.RoleID==r.RoleID
选择r.ToList()
};
foreach(userRoles2中的变量项)
{
控制台写入线(项目);
}
Console.ReadKey();
}
}
公共类用户
{
公共字符串用户标识;
}
公共类用户角色
{
公共字符串用户标识;
公共字符串RoleID;
}
公共阶级角色
{
公共字符串RoleID;
公共字符串RoleName;
}
公共类用户列表
{
公共字符串用户标识;
公开名单角色;
公共重写字符串ToString()
{
字符串输出=用户ID+“”;
foreach(角色中的var角色)
{
输出+=role.RoleName+“,”;
}
output=output.Substring(0,output.Length-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()))
};
db.GetTable()中的u的
在db.GetTable()中加入ur
在u.UserID上等于ur.UserID
在db.GetTable()中加入r
关于ur.RoleID等于r.RoleID
orderby u.UserID
按u.UserID将u分组为g
选择新的
{
UserId=g.Key,
Roles=String.Join(“,”,g.UserRoles.SelectMany(c=>c.Roles)。Select(p=>p.RoleName.ToArray())
};