我正在用c#做一个类似项目的webmail。我有一个MultiSelectList,我在其中尝试选择登录用户所属的所有组,以便用户可以选择这些并向他们发送消息,但是用户不应该获得他们不是的组#39部分的。
这些是我的模特:
public class Group
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<UserGroup> Users { get; set; }
}
public class ApplicationUser : IdentityUser
{
public DateTime LastLoggedIn { get; set; }
public int DeletedMessages { get; set; }
public int LoginCount { get; set; }
public virtual ICollection<UserGroup> Groups { get; set; }
}
public class UserGroup
{
[Key, ForeignKey("User")]
public string UserId { get; set; }
[Key, ForeignKey("Group")]
public int GroupId { get; set; }
public virtual ApplicationUser User { get; set; }
public virtual Group Group { get; set; }
}
这是带有查询的MultiSelectList:
ViewData["ToGroupName"] = new MultiSelectList(_context.Group.Where(group =>
group.Users.Where(user => user.UserId.Contains(currentUserID))
.Select(s => s.GroupId).FirstOrDefault() == group.ID), "ID", "Name");
我使用ApplicationDbContext和DbSets&lt;&gt;从数据库中选择项目。我不明白的是,我在代码的另一部分中使用这个完全相同的查询来获取用户所属的所有组,但由于某种原因,它在此处不起作用。相反,它会选择数据库中的所有组,无论您是否是成员。
我感谢我能得到的任何帮助:)
答案 0 :(得分:1)
看起来你正在尝试做太多..只是检查该组是否有任何与当前用户ID匹配的用户ID ..
你可以使用任何
ViewData["ToGroupName"] = new MultiSelectList(_context.Group.Where(group =>
group.Users.Any(user => user.UserId == currentUserID)), "ID", "Name");
如果集合中的任何项目符合您的条件, Any
将返回true。在这种情况下,如果组ICollection<UserGroup> Users
中的任何UserGroup都有UserId == currentUserID
,那么请在结果中包含该组。