[英]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,因為它們應符合以下規則
所以我希望看到大型活動和紅隊活動
我認為這有點復雜,但與另一個我也無法鍛煉的查詢沒有不同,它只是獲取用戶的所有角色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.