我正在尝试制作一个像 Facebook 这样的社交应用程序,您可以在其中将人们添加为朋友。
我想添加一个“您可能认识的人部分”,其中会显示除您的朋友之外的所有应用程序用户。
我创建了一个模型类
ApplicationUser
,它具有自我多对多关系,以便用户可以拥有多个朋友。这是 ApplicationUser
类的定义:
public class ApplicationUser : IdentityUser
{
public string Fullname { get; set; }
public DateOnly BirthDate { get; set; }
public string? ProfilePicUrl { get; set; }
public string Bio { get; set; }
public ICollection<User_Friend> Users { get; set; }
public ICollection<User_Friend> Friends { get; set; }
}
这是映射 M-N 关系的
User_Friend
模型类的定义:
public class User_Friend
{
public int Id { get; set; }
public string UserId { get; set; }
public ApplicationUser User { get; set; }
public string FriendId { get; set; }
public ApplicationUser Friend { get; set; }
public DateTime FriendsSince { get; set; }
}
这是我的代码;它按预期工作,但看起来必须有更好或更干净的方法
public IActionResult Index()
{
var claim = (ClaimsIdentity)User.Identity;
var user = claim.FindFirst(ClaimTypes.NameIdentifier);
//everyone ids except me
List<string> AllIds = _context.applicationUsers
.Where(u => u.Id != user.Value)
.Select(x => x.Id).ToList();
// friends ids
List<string> friendsIds = _context.user_Friends
.Where(u => u.UserId == user.Value)
.Select(x => x.FriendId)
.ToList();
// non-friends ids
List<string> nonFriendsIds = AllIds.Except(friendsIds).ToList();
List<ApplicationUser> nonFriends = new List<ApplicationUser>();
if (user != null)
{
foreach (var x in nonFriendsIds)
{
nonFriends.Add(_context.applicationUsers.FirstOrDefault(u => u.Id == x));
}
}
return View(nonFriends);
}
你可能会得到像这样的非朋友:
var friendIds = _context.ApplicationUsers
.WHere(x => x.Id == user.Value)
.SelectMany(x => x.Friends.Select(uf => uf.FriendId))
.ToList();
var nonFriends = _context.ApplicationUsers
.Where(x => x.Id != user.Value
&& !friendIds.Contains(x.Id))
.ToList();
请注意,随着用户数量的增长,这样的代码绝对无法很好地扩展。想象一下 Facebook 拥有数亿用户,而 Bot/Fake 帐户的用户数量是其数倍......:)
“你可能认识的人”之类的东西会查看“你朋友的朋友”之类的信息以及其他信息,例如你是否正在跟踪诸如你在哪里上学、你在哪里工作等详细信息以及去过哪里的人大约在同一时间在同一所学校,或者在同一时间在同一家公司工作等等