我有两种不同的方式从我的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();
我意识到第二种方式似乎更受欢迎&#34;但从性能的角度来看,这两种方式之间存在任何差异。特别是有可能有第一种方法的异步版本,或者是否有可能获得最小的好处呢?
答案 0 :(得分:5)
这两种检索数据的方法甚至不相同。
在第二种方法中,您正在编写LINQ to Entities查询并撤回包含Exams的测试列表。执行查询后,所有测试和考试都将添加到实体框架更改跟踪器中。
在第一种方法中,您只是使用Entity Framework来执行某些SQL并将其转换为TestDTO对象。您的任何实体都不会进入更改跟踪器。
第一种方法可能会更快,因为你不涉及跟踪实体,但它们并不是真正具有可比性,因为它们没有做同样的事情。您是否计划对测试和考试进行更改并在DbContext上调用SaveChanges?如果您是,那么您将使用第一种方法手动完成所有这些操作。我不确定你为什么要问这个问题,除非你看到第二个查询的性能问题。如果您不打算使用EF甚至查询数据,为什么不在此时使用SqlReader或DataAdapter。