如何从多个关系中获取导航属性中的数据

时间:2016-01-20 06:57:01

标签: asp.net-mvc entity-framework linq-to-entities many-to-many anonymous-function

这是邻里级,邻居可以有很多粉丝:

public class Neighbourhood
{
    public Neighbourhood()
    {
    this.Followerss = new HashSet<ApplicationUser>();     
    }
    [Key]
    public int Id { get; set; }
    public string NeighbourhoodName { get; set; }
  //Calculated property
  public virtual ICollection<ApplicationUser> Followerss { get; set; }
 }

这是我的ApplicationUser类,用户可以关注多个邻域:

 public class ApplicationUser : IdentityUser<int, CustomUserLogin, CustomUserRole,>
 { 
   public string Address { get; set; }
   public ApplicationUser()
   {
     this.Followings = new HashSet<Neighbourhood>(); 
    }
   public virtual ICollection<Neighbourhood> Followings { get; set; }  

现在,这两者之间存在多对多的关系,因此,它在数据库中创建了一个名为NeighbourhoodApplicationUsers的新表(Neighbourhood_Id和ApplicationUser_Id)。

现在,我希望有一个方法可以回复邻居的追随者所以,我写了这个:

   public virtual IEnumerable<NeighbourhoodProfileModel> GetFollowers(int userId)
    {
        var profiles = _context.Neighbourhoods
            .SelectMany(u => u.Followerss)
            .Select(u => new NeighbourhoodProfileModel
            {
                NeighbourhoodId = u.,
                NeighbourhoodName = u.,
                followersCount = u.,
                IsFollowed = u.Followings.Any(user => user.Id == userId),
            }).ToList();
        return profiles;
    }

我不知道如何在这里建模这个匿名函数,我被困在这里,我想可能是我做错了。在你之后放置(。)点,它应该返回u.NeighbourhoodName之类的东西,但它返回与用户相关的数据,而不是获取与邻居类相关的数据。

如果我注释掉.SelectMany(u =&gt; u.followerss),那么我将获得匿名函数中的所有必需属性。

这是我的观点模型:

public class NeighbourhoodProfileModel
 {
    public int NeighbourhoodId { get; set; }
    public string NeighbourhoodName { get; set; }
    public string City { get; set; }
    public int postCount { get; set; }
    public int followersCount { get; set; }
    public int Followerss { get; set; }
    public bool IsFollowed { get; set; }
 }

请建议我如何修改GetFollowers方法以返回正确的数据。

1 个答案:

答案 0 :(得分:0)

首先它按预期工作,SelectMany从每个Applicationusers获取Neighbourhood的集合并将它们放在一个列表中,所以当你投影它们时你会得到ApplicationUser的属性。

其次你要做的事情是不可能的,你有多对多的关系,所以根据定义,每个Applicationuser可以有多个Neighbourhoods,你怎么能期望找到<每个应用程序强大>一个邻居获取ID和名称等?我认为你正在寻找的关系是一对多,每个社区可以有多个应用程序用户,但每个应用程序用户只有一个社区。当您将用户投射到NeighbourhoodProfileModel时,这将为您提供预期的行为。

所以你的ApplicationUser模型看起来像这样:

public class ApplicationUser : IdentityUser<int, CustomUserLogin,CustomUserRole,>
{ 
  public string Address { get; set; }

  public virtual Neighbourhood NeighbourHood { get; set; }  
}

如果Applicationuser确实需要多个社区,您还可以选择使用Select代替SelectMany。这将创建每个邻域的applicationuser列表的列表。那么投影应该是可能的。

你不需要中间表。您还需要将Neighbourhood的主键作为属性添加到ApplicationUser以及ForeignKey属性。 (除非你选择更流畅的映射,否则会更好)。

(顺便说一下,既然您已投射到Neighbourhoodprofilemodel,那么您就没有匿名功能,如果您有.Select(u => new {})

就属于这种情况