这是邻里级,邻居可以有很多粉丝:
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方法以返回正确的数据。
答案 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 {})