【问题标题】:LINQ-query select statement before order by or vise versa is better在 order by 或反之亦然之前的 LINQ-query select 语句更好
【发布时间】:2017-01-21 03:39:28
【问题描述】:

我想知道以下 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 属性的数据库实体)

【问题讨论】:

  • 为什么不对它们进行基准测试?
  • 埃里克我没听懂你..
  • 当我有实际问题并且没有给出解释只是拒绝投票时,这真的很烦人。
  • 我喜欢你的问题...不知道为什么有人会否决它。无论哪种方式,我建议您将不同风格的查询放在 LINQPad 中,然后查看生成的 SQL。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    但一般来说,在大多数正常情况下,前两个在服务器上的排序应该完全相同,并且只检索一个投影,而最后一个将获取所有 Student 实体数据并实际创建 Student 对象,这是最糟糕的一个。

    p>

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      相关资源
      最近更新 更多