Linq 实体框架多对多查询

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))?? } 有些东西不见了,我不

我想写一个简单的查询,但是有一些问题。 我有两张表M到N:

用户->事件

我想获取特定事件的所有用户(通过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
和not
List
。不,使用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
}