2017-08-09 164 views
0

尝试在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; 

想也许我需要使用包含扩展,所以我想这一点,也将返回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) 

因为如果我删除它,当然会得到结果,但不是特定用户的结果。

我试图按照这里的一个答案给出的建议是:

任何想法?

在此先感谢!

+0

什么是你真正想干什么?给出一些上下文,最好是一个或两个示例模型。 – stybl

+0

@stybl,编辑了这个问题。我希望这有助于澄清。谢谢! – xgp

回答

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; 
+0

问题与您的查询是,即使我将AspNetUserRoles包括到.edmx图中,它不会被导入为可查询实体,因为它没有主键 - 因此,它的存在用于建立AspNetUser和AspNetRoles之间的导航属性。即使我在选择我的表格时将其包含在EF模型中,也没有AspNetUserRoles实体。据我了解,这是EF如何工作。思考? – xgp