簡體   English   中英

Linq查詢多對多關系

[英]Linq query on many to many relationship

我在一個組織的網站上工作,這是非盈利性的,而且我是免費的,所以我並不是在這里找人來替我工作,我只是在尋找一些非常棘手的東西方面有所幫助對我來說比較新

使用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)只有兩列都是外鍵,如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和角色名稱。

因此,在獲得靈感之后,我設法解決了兩個問題,事實證明,為用戶獲取角色比我想象的要容易

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM