C# 多对多关系的Linq查询

C# 多对多关系的Linq查询,c#,linq,entity-framework,C#,Linq,Entity Framework,我在一个组织的网站上工作,这是非盈利的,我是免费的,所以我不想在这里找人帮我做我的工作,只是在一些我觉得非常棘手的事情上帮点忙,因为这对我来说是比较新的 使用aspnet实体的数据库 所以我查询的表是 - AspNetRoles - AspNetUserRoles - AspNetUsers 我也有自己的桌子 - myEvents (Id, Title, PrivateEvent) - myEventsInRoles (EventId, RoleId) - EventId is

我在一个组织的网站上工作,这是非盈利的,我是免费的,所以我不想在这里找人帮我做我的工作,只是在一些我觉得非常棘手的事情上帮点忙,因为这对我来说是比较新的

使用aspnet实体的数据库

所以我查询的表是

 - AspNetRoles
 - AspNetUserRoles
 - AspNetUsers
我也有自己的桌子

 - myEvents (Id, Title, PrivateEvent)
 - myEventsInRoles (EventId, RoleId)
  - EventId is FK to myEvents(Id) and RoleId is FK to AspNetRoles(Id)
现在,当我创建ADO实体模型时,因为MyEventsRoles(如AspNetUserRoles)只有两列,这两列都是外键,如AspNetUserRoles,所以它不会为其生成实体。因此,不能使用linq查询这两个表

所以我的设想是这样的

用户登录并希望查看事件列表。所以我们可以举个例子

 - AspNetUsers
  - Id=1
 - AspNetUserRoles
  - UserId=1, RoleId=1
 - AspNetRoles
  - Id=1, Name=Red Team 
  - Id=2, Name=Blue Team 
  - Id=3, Name=Green Team
 - myEvents
  - Id=1, Title=Big event, PrivateEvent=0
  - Id=2, Title=Red And Green Team event, PrivateEvent=1
  - Id=3, Title=Blue Team event, PrivateEvent=1
 - myEventsInRoles
  - EventId=2, RoleId=1
  - EventId=2, RoleId=3
  - EventId=3, RoleId=2
假设我们的用户在红色团队中

选择供其查看的事件应为事件1和2,因为它们应符合以下规则

PrivateEvent标志设置为false的所有事件 PrivateEvent标志设置为true和的所有事件 该eventId存在于MyEventsRoles中,并且该用户具有与MyEventsRoles中的该记录关联的相同RoleId 所以我希望看到大型赛事和红队赛事


我相信这有点复杂,但与另一个我也无法解决的问题没有什么不同,那就是简单地获取用户的所有角色Id和角色名称。

因此,在灵感一闪之后,我设法解决了我的两个问题,为用户获取角色结果比我想象的要容易

var ctx = new ApplicationDbContext();
var user = HttpContext.Current.User;
var userId = user.Identity.GetUserId();
    var roles =
      ctx.Roles.Where(a => a.Users.Select(b => b.UserId).ToList().Contains(userId))
        .ToList();
还有我的事件

    var events =
              db.myEvents.Where(
                e =>
                e.date >= DateTime.Now
                && ((!e.@private)
                    || (e.@private
                        && e.AspNetRoles.Where(a => a.AspNetUsers.Select(b => b.Id)
                             .ToList()
                             .Contains(userId))
                             .Select(c => c.myEvents.Select(d => d.Id)
                             .ToList()
                             .Contains(e.Id))
                             .Any())))
                .Select(
                  e =>
                  new EventItem
                    {
                      id = e.Id,
                      date = e.date,
                      description = e.description,
                      privateE = e.@private,
                      title = e.title,
                      type = e.type,
                      url = e.url
                    });

public class EventItem
{
  public int id { get; set; }
  public DateTime? date { get; set; }
  public string description { get; set; }
  public string title { get; set; }
  public string type { get; set; }
  public string url { get; set; }
  public bool privateE { get; set; }
}

如果有人能帮上忙,不仅仅是寻找答案,还有人能解释它是如何工作的:也许这会有帮助: