linq和lambda之间对实体查询的性能

本文关键字:查询 性能 实体 lambda 之间 linq | 更新日期: 2023-09-27 18:01:59

我在查询中有一个疑问,它有点慢,我想知道什么是最好的性能

让我们展示第一个例子:

var result = from tableA in context.TableA
             join tableB in context.TableB on tableA.id equals tableB.id
             where *some conditions*
             select new {
                 tableA.id,
                 tableA.name,
                 another_name = tableA.TableC.name
                 some_operation = tableB.price * tableB.TableD.some_coeficient
                 another_operation = tableB.TableE.Sum(c=> c.some_value)
             };

这是我现在所拥有的(在此查询之后,我在另一个变量a result.ToList()中执行。

我的问题是,如果在性能水平上做得更好:

  1. 与Lambda表达式的查询?保持select new {....}部分。
  2. ToList()select new {....}部分的查询?

你建议我做什么?

linq和lambda之间对实体查询的性能

将其更改为lambda表达式不会影响性能-它们将被编译成相同的SQL。我建议使用像LinqPad这样的工具来帮助确定正在生成的SQL。

你肯定想在 ToList()之前做一个select ,因为这只会从SQL中选择你需要的数据,但是在ToList()之后做它会在内存中做。

  1. 这是完全一样的。查询表达式基本上被转换为非查询表达式的等效物。

  2. 你需要使用select new { tableA, tableB }或类似的东西,这样你就可以在ToList之后使用两个变量…但它可能会比:

    • 所有字段将从数据库中提取,而不仅仅是那些使用
    • 投影(包括Sum等)都将在从数据库中获取值之后发生,而不是在数据库中。这很可能涉及到更多的数据库请求,访问tableA.TableC等。

您应该查看生成的SQL,在SQL分析器中运行它以找出慢的地方,考虑更多的索引等。