2013-02-08 47 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