Database.SqlQuery和EF 6.1在性能上有什么区别吗?

2 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();
Run Code Online (Sandbox Code Playgroud)

我意识到第二种方法似乎更“流行”,但是从性能的角度来看,这两种方法之间没有任何区别。特别是有可能具有第一种方法的异步版本,或者无论如何都可能具有最小的收益?

Dis*_*ile 5

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

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

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

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

  • 然后是[AsNoTracking](http://msdn.microsoft.com/zh-cn/library/gg679352(v = vs.103).aspx),用于在不需要更改跟踪时提高EF性能。 (2认同)