使用带有导航属性的Linq

时间:2017-08-09 20:44:14

标签: entity-framework linq

尝试在Linq查询中使用导航属性而不会获得任何结果。不知道为什么。

我在SQL Server中使用标准的简单成员资格表和实体框架。所以我把三张桌子AspNetUsers,AspNetRoles和AspNetUserRoles拉到了我的模型中(见下图)

是的,我知道我可以使用角色/身份功能,我只是使用这些表格来尝试这些LINQ QUERY,这些表格使用方便

无论如何,我的目标是使用导航属性来获取给定用户的角色。 AspNetUserRoles不会作为一个实体被拉入我的模型,因为它没有主键,所以这似乎是正确的方法。我尝试使用此处提供的建议:

Linq to entities navigation properties

以下linq查询返回0结果

var result = (from r in context.AspNetRoles
         where r.AspNetUsers.Any(u => u.Id == UserId)
         select r).ToList();
return result; 

想到也许我需要使用Include扩展所以我试过这个,也返回0结果

var result = (from r in context.AspNetRoles
          where r.AspNetUsers.Any(u => u.Id == UserId)
          select r).Include("AspNetUsers").ToList();
return result;

我知道我在做错了一行:

where r.AspNetUsers.Any(u => u.Id == UserId)

因为如果我将其删除,我会得到结果,但当然不是针对特定用户。

我正在尝试遵循其中一个答案中给出的建议:

有什么想法吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望根据用户ID获取所有用户角色。

除非我遗漏了一些关于您的用户模型的信息,否则如果不访问AspNetUserRoles则无法获得此信息。

如果您可以访问该表,那么这变得非常简单:

var result = AspNetUserRoles.Where(role => role.UserId == UserId)
    .Select(userRole => AspNetRoles.First(role => role.Id == userRole.RoleId));

或者在查询语法中:

var result = from userRole in AspNetUserRoles
             where userRole.UserId == UserId
             from role in AspNetRoles
             where role.Id == userRole.RoleId
             select role;