2013-02-08 44 views
8
public class UserBuilding 
    { 
     [Key, Column(Order = 0)] 
     public int UserId { get; set; } 
     [Key, Column(Order = 1)] 
     public int BuildingId { get; set; } 
     public int BuildingLevel { get; set; } 
    } 

如果我想返回所有屬於用戶的不同的建築物,我會做到以下幾點:實體框架:如何使用複合鍵從表中返回一行?

database.UserBuildings.Where(b => b.UserId == userId); 

我的問題是,如果我想從一個特定的用戶返回一個特定的建築是什麼?什麼是最有效的方法呢?有沒有更好的辦法(如內置函數)比下面

database.UserBuildings.Where(b => b.UserId == userId && b.BuildingId == buildingId); 

回答

16

我想你lookding爲DbSet.Find方法。該方法通過主鍵找到實體。如果您有複合主鍵,然後按照他們在模型中定義的順序傳遞鍵值:

var userBuilding = database.UserBuildings.Find(userId, buildingId); 
+1

作品像一個魅力謝謝!你認爲就算法的速度而言,這會被認爲是「更高效」嗎? – Deniz 2013-02-08 21:51:38

+0

@Deniz在查詢數據庫之前查找是否已經在上下文中檢查實體是否已經在上下文中,所以是的,它的效率更高 – 2013-02-08 21:55:42

+2

@Deniz:如果實體* *未加載,'Find'實際上可能會慢得多(http://stackoverflow.com/問題/ 11686225/dbset找到的法 - 可笑 - 慢相比對的SingleOrDefault-ON-ID)。經驗法則,也許:如果該對象可能已經在上下文中,則使用「查找」。如果您知道它尚未加載或極不可能,請在您的問題中使用查詢。 – Slauma 2013-02-08 22:19:20