在order by之前的LINQ-query select语句或反之亦然

时间:2017-01-21 03:39:28

标签: c# .net performance entity-framework linq

我想知道以下3个Linq表达式中的哪一个是相同的,或者一个是否与其他表达式相比更好,为什么?

var studentDetails1 = context.Student.OrderBy(a => a.Age).Select(s => new { s.Name, s.Age }).ToList();


var studentDetails2 = context.Student.Select(s => new { s.Name, s.Age }).OrderBy(a => a.Age).ToList();


var studentDetails3 = context.Student.OrderBy(a => a.Age).ToList().Select(s => new { s.Name, s.Age });

(通常这里的上下文意味着DBContext和Student是具有Name和Age属性的数据库实体)

2 个答案:

答案 0 :(得分:2)

正如Lukasz Rozmejit所回答的,它确实依赖于实体框架方言实施。通常,前两个将评估相同的SQL。最后一个将获取不必要的数据并仅使用两列。 数据库专家建议我不要在数据库中排序。 SQL cpu时间是最昂贵的CPU时间。

var studentDetails1 = context.Student.Select(s => new {s.Name,s.Age})。ToList()。OrderBy(a => a.Age);

这将在服务器中进行排序,而不是在数据库中使用CPU。

答案 1 :(得分:1)

它实际上可以依赖于实际的linq提供程序实现,并且在这个特定的示例中实体框架方言补充。

但总的来说,在大多数理智场景中,前两个应该在服务器上执行完全相同的排序并仅检索投影,而最后一个将获取所有Student实体数据并实际创建Student对象,使其成为最差的。