实体框架:如何从具有复合键的表中返回一行?
Posted
技术标签:
【中文标题】实体框架:如何从具有复合键的表中返回一行?【英文标题】:Entity framework: How to return a row from a table with composite keys? 【发布时间】:2013-02-08 21:38:58 【问题描述】: 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);
【问题讨论】:
【参考方案1】:我认为您正在寻找DbSet.Find 方法。此方法通过主键查找实体。如果您有复合主键,则按照它们在模型中定义的顺序传递键值:
var userBuilding = database.UserBuildings.Find(userId, buildingId);
【讨论】:
像魅力一样工作谢谢!您认为就算法的速度而言,这会被认为“更高效”吗? @Deniz Find 在查询数据库之前首先检查实体是否已经在上下文中,所以是的,它更有效 @Deniz:Find
如果实体未加载(***.com/questions/11686225/…),实际上会慢得多。经验法则,也许:如果对象可能已经在上下文中,请使用Find
。如果您知道它尚未加载或不太可能加载,请在您的问题中使用查询。
@Slauma 谢谢,不知道如果实体不在上下文中,Find 会慢得多。顺便说一句,有性能测试吗?
@lazyberezovsky:关于Find
我只知道链接问题中的测量值。通常,DbContext
中的自动更改检测(=在许多 EF 方法中发生的内部 DetectChanges
调用)因速度慢而臭名昭著(Attach
是另一个示例:***.com/a/5921259/270591。或Add
:***.com/a/5943699/270591)。但在只有少数实体附加到上下文的情况下,这无关紧要。通常只考虑“批量操作”。以上是关于实体框架:如何从具有复合键的表中返回一行?的主要内容,如果未能解决你的问题,请参考以下文章