Linq 实体框架多对多查询
我想写一个简单的查询,但是有一些问题。 我有两张表M到N: 用户->事件 我想获取特定事件的所有用户(通过eventId获取此事件)Linq 实体框架多对多查询,linq,entity-framework-5,Linq,Entity Framework 5,我想写一个简单的查询,但是有一些问题。 我有两张表M到N: 用户->事件 我想获取特定事件的所有用户(通过eventId获取此事件) public IQueryable GetUsersByEventId(int-eventId) { IQueryable query=this.Context.Users.AsQueryable(); 返回query.Where(x=>x.Events.SingleOrDefault(e=>e.EventId==EventId))?? } 有些东西不见了,我不
public IQueryable GetUsersByEventId(int-eventId)
{
IQueryable query=this.Context.Users.AsQueryable();
返回query.Where(x=>x.Events.SingleOrDefault(e=>e.EventId==EventId))??
}
有些东西不见了,我不知道是什么,有人能帮我吗?非常感谢 如果我理解正确(添加您的模型会有帮助),我认为您需要
Any
public IQueryable<User> GetUsersByEventId(int eventId)
{
return Context.Users
.Where(u => u.Events.Any(e => e.EventId == eventId));
}
我建议您在事件模型本身中这样做。如果您使用的是
Event
、User
和EventUsers
表格,这是许多人的标准资料
public class Event
{
public int Id { get; set; }
// ...
public virtual ICollection<EventUsers> EventUsers { get; set; } // This is table that holds EventId, UserId (many2many)
public IQueryable<User> Users { get { return this.EventUsers.Select(x => x.User); } } // Get all users that are in this event
}
公共类事件
{
公共int Id{get;set;}
// ...
公共虚拟ICollection EventUsers{get;set;}//这是一个包含EventId、UserId(many2many)的表
publicIQueryable用户{get{返回this.EventUsers.Select(x=>x.User);}}//获取此事件中的所有用户
}
如果联接表上没有其他属性,我认为联接表本身没有一个典型的模型。通常,您只需通过集合将事件直接连接到用户。@tvanfosson您的意思是让EF创建表,这样您就不必创建表了?我做过一次,结果很糟糕,因为EF所做的查询是N+1
,所以我坚持将模型2db1映射到1,以获得更多的控制。因此,IQueryable
和notList
。不,使用OnModelCreating通过表直接映射用户和事件,但不直接在模型中公开联接表。看见
public class Event
{
...
public virtual ICollection<User> Users { get; set; }
}
var evt = repo.GetEventById(id);
var users = evt.Users;
public class Event
{
public int Id { get; set; }
// ...
public virtual ICollection<EventUsers> EventUsers { get; set; } // This is table that holds EventId, UserId (many2many)
public IQueryable<User> Users { get { return this.EventUsers.Select(x => x.User); } } // Get all users that are in this event
}