c# - 实体框架:多个查询与内部连接
问题描述
我目前正在使用 Entity Framework,并且有关于内部连接的性能问题。
从总体上看,以下两种情况中哪一种是最好的?
为简单起见,假设兄弟姐妹之间存在一对一的关系。
(1)内连接:
EFContext context = new EFContext();
int myId = GetMyOwnId();
Person me = context.People
.Include(p => p.Father)
.Include(p => p.Mother)
.Include(p => p.Brother)
.Include(p => p.Sister)
.Where(p => p.ID == myId);
return me;
(2)可选的多重查询:
EFContext context = new EFContext();
int myId = GetMyOwnId();
Person me = context.People
.Where(p => p.ID == myId);
if (me.FatherId.HasValue)
me.Father = context.People.Find(me.FatherId);
if (me.MotherId.HasValue)
me.Mother = context.People.Find(me.MotherId);
if (me.BrotherId.HasValue)
me.Brother = context.People.Find(me.BrotherId);
if (me.SisterId.HasValue)
me.Sister = context.People.Find(me.SisterId);
return me;
那么哪种情况最适合每种情况?
或者对于没有家庭的人,或者有父母和兄弟姐妹的人来说,一个比另一个更好?
解决方案
选项 (1) 应该总是更好,因为 JOIN 是在数据库级别执行的。根据经验,您可以说本机数据库检查比代码检查更快,并且数据库和代码之间的多次往返总是比一次慢。由于数据库将隐式检查连接上的空 ID,因此无需在代码中执行此操作并为此添加可能的额外往返。此外,如果数据库知道查询的意图,它将能够自动优化执行计划,这可以提供另一个性能提升 - 特别是在正确设置约束和/或频繁执行查询的情况下。
也许有人可以为此添加一个基准以 100% 确定,但从纯粹的逻辑角度来看,如果没有发生任何奇怪的事情,这应该是正确的。
推荐阅读
- gcc - 如何在 x86 汇编中将 unsigned long 转换为单精度浮点?
- ios - 动态集合视图单元格的顶部对齐方式应该相同
- android - 我正在尝试通过Android设备(华为)上的听筒播放音频,但没有声音输出,我尝试了很多方法
- reactjs - 将项目从 Todolist 移动到删除列表并从 TodoList 中删除
- javascript - 每次更改 URL 的通知
- php - 木材分页:page.php / 未显示
- eclipse-hono - 霍诺的网关
- android - 如何在android studio中使用html格式创建PDF文件
- ios - 已发布的应用程序不会在 App Store 上自动更新
- forms - 来自银行的 Google 表单随机问题,每次打开表单时都会有所不同