在性能上有什么不同吗?SqlQuery和EF 6.1

本文关键字:SqlQuery EF 性能 什么 | 更新日期: 2023-09-27 18:10:42

我有两种不同的方式从我的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();

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

在性能上有什么不同吗?SqlQuery和EF 6.1

这两种检索数据的方法甚至不相等。

在第二个方法中,您正在编写LINQ到实体查询并回拉包含考试的测试列表。查询执行后,所有测试和考试将被添加到实体框架更改跟踪器中。

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

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