c# - Database.SqlQuery 和 EF 6.1 之间的性能有什么区别吗?

标签 c# asp.net asp.net-mvc entity-framework asp.net-web-api

我有两种不同的方法从 SQL 数据库获取数据:

var sql = @"Select Exam.Name, Test.TestId, Test.QuestionsCount, Test.Title
            FROM Test
            INNER JOIN Exam
               ON ( Test.ExamId = Exam.ExamId)
            WHERE Test.TestStatusId = 1";
        var tests1 = db.Database.SqlQuery<TestDTO>(sql).ToList();

        var tests2 = await db.Tests
            .Include(t => t.Exam)
            .Where(t => t.TestStatusId == 1)
            .Select(t => new TestDTO
            {
                ExamName = t.Exam.Name,
                Id = t.TestId,
                QuestionsCount = t.QuestionsCount,
                Title = t.Title
            })
            .ToListAsync();

我意识到第二种方式似乎更“流行”,但是从性能的角度来看,这两种方式之间有什么区别。特别是是否有可能拥有第一种方法的异步版本,或者无论如何拥有它可能带来的好处微乎其微?

最佳答案

这两种检索数据的方法并不相同。

在第二种方法中,您正在编写 LINQ to Entities 查询并拉回包含考试的测试列表。执行查询后,所有测试和考试都将添加到 Entity Framework 更改跟踪器中。

在第一个方法中,您只是使用 Entity Framework 执行一些 SQL 并将其转换为 TestDTO 对象。您的任何实体都不会出现在变更跟踪器中。

第一种方法可能会更快,因为您不涉及跟踪实体,但它们实际上并不具有可比性,因为它们没有做相同的事情。您是否计划对测试和考试进行更改并在 DbContext 上调用 SaveChanges?如果是,那么您将使用第一种方法手动完成所有这些操作。不过,我不确定您为什么要问这个问题,除非您发现第二个查询存在性能问题。如果您不打算使用 EF 来查询数据,那么此时为什么不直接使用 SqlReader 或 DataAdapter。

关于c# - Database.SqlQuery 和 EF 6.1 之间的性能有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24451480/

相关文章:

asp.net - 如何配置 ASP.NET Core 来处理循环引用而不破坏主体的响应?

c# - 通过存储库将数据库实体映射到域实体 - 静态属性或单独的服务?

javascript - 将复杂的字典发布到 Controller

c# - 无法将 IEnumerable<T> 的类型隐式转换为 IEnumerable<T>

c# - 自定义 PowerShell 主机并将 PSObject 转换回基本类型

c# - 将数组值写入 SQL 数据库

asp.net - 加速 ASP.NET 开发

Asp.net 身份密码哈希

javascript - 对于外部 JS 文件有类似 T4MVC 的解决方案吗?

c# - String.Format 与 string.Format 的对比。有什么问题吗?