首页 > 解决方案 > 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();
}

标签: c#performanceentity-frameworklinqjoin

解决方案


你怎么知道一辆车是否比另一辆车快?驾驶他们两个并比较时间。

通常,数据库在连接数据方面比内存中的 Linq 更有效(由于预先计算的索引、哈希等),但在某些情况下,内存中的速度肯定会更快。但是,当您没有将所有数据拉入内存时,通过网络传输更少数据的好处可能比连接中的任何性能改进产生更大的差异。

所以没有一个确定的答案。从可行的东西开始,然后通过测量更改前后的时间来关注性能改进。


推荐阅读