我在一个组织的网站上工作,这是非营利性的,而且我是免费的,所以我不是在寻找有人在这里为我做我的工作,只是对我发现非常棘手的一些帮助因为这对我来说相对较新
正在使用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,因为它们应符合以下规则
所以我希望看到大事件和红队事件
我认为这有点复杂但与另一个查询不同我也无法锻炼,这只是为用户获取所有角色ID和角色名称。
答案 0 :(得分:0)
因此,经过一番灵感,我设法实际解决了我的两个问题,用户的获取角色比我想象的更容易
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; }
}