实体框架:如何从具有复合键的表中返回行?

Den*_*niz 9 entity-framework row return composite-key

  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; }
    }
Run Code Online (Sandbox Code Playgroud)

如果我想要返回属于用户的所有不同建筑物,我会执行以下操作:

database.UserBuildings.Where(b => b.UserId == userId);
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我想从特定用户返回特定建筑物,该怎么办?这样做最"有效"的方式是什么?有没有比以下更好的方法(例如内置函数):

database.UserBuildings.Where(b => b.UserId == userId && b.BuildingId == buildingId);
Run Code Online (Sandbox Code Playgroud)

Ser*_*kiy 17

我想你正在寻找DbSet.Find方法.此方法按主键查找实体.如果您有复合主键,则按照它们在模型中定义的顺序传递键值:

var userBuilding = database.UserBuildings.Find(userId, buildingId);
Run Code Online (Sandbox Code Playgroud)

  • @Deniz:如果实体没有被加载,`Find`实际上会慢得多(http://stackoverflow.com/questions/11686225/dbset-find-method-ridiculously-slow-compared-to-singleordefault-on- ID).经验法则,可能:如果对象可能已经在上下文中,请使用"查找".如果您知道它尚未加载或者不太可能,请在您的问题中使用查询. (2认同)