2013-08-24 232 views
3

我想寫一個簡單的查詢,但也有一些問題。 我有2個表M到N:實體框架多對多查詢

用戶 - >事件。

我想獲取特定事件的所有用戶(通過eventId獲取此事件)。

public IQueryable<User> GetUsersByEventId(int eventId) 
{ 
    IQueryable<User> query = this.Context.Users.AsQueryable(); 

    return query.Where(x => x.Events.SingleOrDefault(e => e.EventId == eventId)); ?? 
} 

東西丟失,我不知道什麼,有人可以幫我嗎?非常感謝 !

回答

7

如果我理解你正確地(將你的模型將幫助),我想你想Any

public IQueryable<User> GetUsersByEventId(int eventId) 
{ 
     return Context.Users 
        .Where(u => u.Events.Any(e => e.EventId == eventId)); 
} 

這應返回誰擁有符合指定ID的任何事件的所有用戶。

注意:如果您正確設置了關係,則應該能夠直接從事件中獲取此關係。

public class Event 
{ 
    ... 
    public virtual ICollection<User> Users { get; set; } 
} 

那麼,你可以通過id獲取Event並訪問它的用戶集合。

var evt = repo.GetEventById(id); 
var users = evt.Users; 
1

我建議你在你的事件模型本身做這件事。 AFAIK您正在使用EventUserEventUsers表,這是很多標準的東西。

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 
} 
+0

如果在連接表上沒有其他屬性,我認爲爲連接表本身設置模型並不常見。通常,您只需通過集合將事件直接連接到用戶。 – tvanfosson

+0

@tvanfosson你的意思是讓EF創建表,所以你甚至不必?我這樣做了一次,結果很糟糕,因爲查詢EF做的是'N + 1',所以我堅持將Models2DB 1映射到1以獲得更多控制權。因此'IQueryable'而不是'List'。 – sed

+0

不,使用OnModelCreating通過表直接在用戶和事件之間映射,但不直接在模型中公開連接表。見http://www.codeproject.com/Articles/234606/Creating-a-Many-To-Many-Mapping-Using-Code-First – tvanfosson