2
我敢肯定,我可以得到我从一个单一的LINQ声明想要的结果,我只是不能由我自己找到它!这是我到目前为止有:的Linq:多个子加入或子查询
var query = from uir in Aspnet_UsersInRoles
join r in Aspnet_Roles
on uir.RoleId equals r.RoleId
select new
{
UserId = uir.UserId,
RoleName = r.RoleName
};
var query2 = from q in query
group q by q.UserId into roles
select new
{
UserId = roles.Key,
Roles = roles.Distinct()
};
var query3 = from u in Aspnet_Users
join q in query2
on u.UserId equals q.UserId
select new
{
UserId = u.UserId,
UserName = u.UserName,
Roles = q.Roles
};
,这是不正确的,即使我并不真的需要有用户ID在“角色”列表/ IEnumerable的,只是每个UserId的角色名称列表。
我使用asp.net成员SQL表,基本上我想获得用户包括他们的角色的列表。
- 每个用户可能有多个角色。
- 用户可能根本没有作用(应该仍然显示在结果)
能否请你帮我或点我就如何从一个单一的LINQ的声明相同的结果正确的方向?
PS。是的,我是Linq新手和SQL老手,可能会模糊我的想法。
编辑
好吧,我想我得到它:
var q = from u in Aspnet_Users
from up in UserProfiles.Where(_up => _up.UserId == u.UserId).DefaultIfEmpty()
from uir in Aspnet_UsersInRoles.Where(_uir => _uir.UserId == u.UserId).DefaultIfEmpty()
from r in Aspnet_Roles.Where(_r => _r.RoleId == uir.RoleId).DefaultIfEmpty()
group r.RoleName by new {
u.UserId,
u.UserName,
up.FirstName,
up.LastName,
u.LastActivityDate
} into g
select new
{
userID = g.Key.UserId,
firstName = g.Key.FirstName,
lastName = g.Key.LastName,
userName = g.Key.UserName,
lastActivityDate = g.Key.LastActivityDate,
roles = g.Distinct()
};
你觉得呢? (我从我自己的UserProfiles表中添加了信息,与Aspnet_Users的关系为1:1)
我得到:“'userRole'这个名字不在'equals'左边的范围内,考虑交换'equals'两边的表达式。 – qbantek 2010-11-07 00:47:48
如果我换,我得到了表达:“这个名字‘用户’是不是在范围上的‘等于’左侧考虑交换上的‘等于’两边的表情。” – qbantek 2010-11-07 00:48:33
啊,是的,我的错误,我试图保持它的可读性,并改变我可能不应该有的东西。 groupby将'userRole'带出范围。 – 2010-11-07 00:53:15