c# - Linq - 内存连接与 EF 连接
问题描述
使用 EF 6 和 SQL 2014。
假设您有一个索引良好且标准化的数据库。将实体拉入内存然后在 IEnumerables 上执行连接或让 EF 通过 IQueryable 连接是否“更好”?
通过更好 -> 更快的执行时间,更少的数据库读取,内存使用。
内存中的示例:
using (var context = myDbContext())
{
var table1 = await context.Table1.ToListAsync();
var table2 = await context.Table2.ToListAsync();
var table3 = await context.Table3.ToListAsync();
var resultSet = table1
.Join(table2, t1 => t1.Id, t2 => t2.Table1Id, (t1,t2) => new {t1, t2})
.Join(table3, x => x.t2.Table2Id, t3 => t3.Table2Id, (x, t3) => new { x.t1, x.t2, t3})
.ToList();
}
示例 EF:
using (var context = myDbContext())
{
var resultSet = await context.Table1
.Join(context.Table2, t1 => t1.Id, t2 => t2.Table1Id, (t1,t2) => new {t1, t2})
.Join(context.Table3, x => x.t2.Table2Id, t3 => t3.Table2Id, (x, t3) => new { x.t1, x.t2, t3})
.ToListAsync();
}
解决方案
你怎么知道一辆车是否比另一辆车快?驾驶他们两个并比较时间。
通常,数据库在连接数据方面比内存中的 Linq 更有效(由于预先计算的索引、哈希等),但在某些情况下,内存中的速度肯定会更快。但是,当您没有将所有数据拉入内存时,通过网络传输更少数据的好处可能比连接中的任何性能改进产生更大的差异。
所以没有一个确定的答案。从可行的东西开始,然后通过测量更改前后的时间来关注性能改进。
推荐阅读
- asp.net - 从后面的代码中禁用 asp.net 日历回发
- python - 使用 try,但使用 Maya Python 检查以确保选择中的项目是正确的节点类型
- pandas - 具有动态组成员身份的 Pandas groupby
- python - 在 Python 中将氨基酸转换为整数
- reactjs - React Native - 文件永远编译(可能是无限循环?)
- javascript - React Redux 未在状态更新时呈现
- tensorflow - `tf.keras.applications.xception.preprocess_input` 在做什么?
- python - 如何找到递归结果的总和
- linux - 识别哪个 USB 设备是 /dev/ttyUSB0
- powershell - OneDrive LastSignInTime 注册表到 DateTime 格式