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

Entity framework 实体框架:如何从具有复合键的表中返回行?,entity-framework,return,row,composite-key,Entity Framework,Return,Row,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 {

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

  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);
我的问题是,如果我想从特定用户处返回特定的建筑,该怎么办?最“有效”的方法是什么?是否有比以下方法更好的方法(如内置函数):

  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);

很有魅力谢谢!你们认为从算法的速度来看,这会被认为是“更高效的”吗?@Deniz Find首先在查询数据库之前检查实体是否已经在上下文中,所以是的,它的效率更高efficient@Deniz:
Find
如果没有加载实体(),实际上会慢得多。经验法则:如果对象可能已经在上下文中,则使用
Find
。如果您知道该实体尚未加载或不太可能加载,请在问题中使用该查询。@Slauma谢谢,我不知道如果实体不在上下文中,查找速度会慢很多。顺便说一句,有性能测试吗?@lazyberezovsky:关于
Find
我只知道链接问题中的度量。通常,
DbContext
中的自动更改检测(=许多EF方法中发生的内部
DetectChanges
调用)因速度慢而臭名昭著(
Attach
是另一个示例:。或
Add
:)。但在只有少数实体附加到上下文的情况下,这并不重要。通常只考虑“批量操作”。