我正在使用MVC3,C#,.NET4,EF5。 我正在使用ASP.NET成员资格提供程序。 我为每个用户使用一个角色,尽管该模型支持1个用户多个角色。
我需要在提取用户信息时在LINQ查询中提取这一角色。本质上,我只需要给定用户的“First()”角色记录。
我有一个Application User表,它使用AspNet.Membership表映射1到1。
类似于:
List<StdOrgUser> myUsers = Model.Select(i => new StdOrgUser(){
Id=i.Id,
Rolename = i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.FirstOrDefault().RoleName
}).ToList();
Intellisense也允许我编写上面的代码,它不会在实践中运行。 我应该如何获得此角色名称值以及此记录的用户详细信息? 该模型将进入WebGrid进行显示。
编辑:
我修改过的代码,预测试建议!
var myUsers = Model.Select(i => new{
Id = i.Id,
Firstname = i.Firstname,
initials = i.Initials,
Lastname = i.Lastname,
Username = i.Aspnet_Membership.Aspnet_Users.UserName,
RoleName = i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.FirstOrDefault().RoleName,
Organisation = i.StdOrg.Name
}).ToList();
EDIT2:发布空测试:
var myUsers = Model.Select(i => new {
Id = i.Id,
Firstname = i.Firstname,
initials = i.Initials,
Lastname = i.Lastname,
Username = i.Aspnet_Membership.Aspnet_Users.UserName,
RoleName = i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.Any() ? i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.FirstOrDefault().RoleName : "No Roles",
Organisation = i.StdOrg.Name
}).ToList();
然后我将第二个模型提供给我的webgrid。
答案 0 :(得分:1)
您需要稍微将查询管道的RoleName属性访问权限移开。目前你正在这样做:
i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.FirstOrDefault().RoleName
因此,如果Aspnet_Roles.FirstOrDefault()
返回默认值(null
),则会得到空引用异常。相反,您应该先将Aspnet_Roles
投射到RoleName
,然后再使用FirstOrDefault()
:
i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.Select(ar => ar.RoleName).FirstOrDefault()
如果您需要替换默认角色,则可以合并:
i.Aspnet_Membership.Aspnet_Users.Aspnet_Roles.Select(ar => ar.RoleName).FirstOrDefault() ?? "No Role"
与使用Any
检查空值相比,这使得查询更简洁(并且在SQL端也会更高效)。
答案 1 :(得分:0)
这样的事情对你有用吗?
var query =
from i in Model
from r in i
.Aspnet_Membership
.Aspnet_Users
.Aspnet_Roles
.Take(1)
select new StdOrgUser()
{
Id = i.Id,
Rolename = r.RoleName
};
List<StdOrgUser> myUsers = query.ToList();