如何通过LINQ提取“一对多”关系中的第一条记录?

时间:2013-08-23 09:00:35

标签: asp.net-mvc asp.net-mvc-3 linq linq-to-entities

我正在使用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。

2 个答案:

答案 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();