【问题标题】:Linq query on many to many relationshipLinq查询多对多关系
【发布时间】:2014-12-11 23:52:28
【问题描述】:

我在一个组织的网站上工作,这是非营利性的,我是免费做的,所以我不是在这里找人来帮我做我的工作,只是在我发现非常棘手的事情上提供一些帮助因为它对我来说比较新

使用 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 实体模型时,因为 myEventsInRoles(如 AspNetUserRoles)只有 2 列,它们都是外键,如 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,因为它们应符合以下规则

  1. 将 PrivateEvent 标志设置为 false 的所有事件
  2. 所有将 PrivateEvent 标志设置为 true 的事件和 该 eventId 存在于 myEventsInRoles 中,并且用户具有与 myEventsInRoles 中的该记录关联的相同 RoleId

所以我希望看到大事件和红队事件

我认为这有点复杂,但与另一个我也无法锻炼的查询没有什么不同,即简单地获取用户的所有角色 ID 和角色名称。

【问题讨论】:

标签: c# linq entity-framework


【解决方案1】:

所以在灵光一现后,我设法真正解决了我的两个问题,结果用户的获取角色比我想象的要容易

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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    相关资源
    最近更新 更多