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

问题描述:

我对查询有点怀疑,它有点慢,我想知道什么是最好的性能。linq到linq和lambda之间的实体查询的性能?

让目前的这第一个例子:

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) 
      }; 

这就是我现在所拥有的(此查询后,我在另一个变量result.ToList()

弥问题是,如果是在各级更好地履行。性能进行:?

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

你推荐我做什么?

+0

你的where子句可能很重要,如果它变成SQL服务器找不到索引或没有索引的东西,它可能会导致性能下降。 – Mant101

  1. 它会完全一样。查询表达式基本上被转换为非查询表达式的等价物。

  2. 你需要使用select new { tableA, tableB }或类似的东西,无论如何,这样你就可以ToList后使用这两个变量...但它很可能是为则:

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

你应该看看生成的SQL,在SQL事件探查器中运行它制定出什么是缓慢的,考虑更多的指标等。

+0

在查询中有什么更好的方法,可以在'tableA.TableC'这样的'select new'上执行嵌套,或者在'TableC'上对查询执行'join'? –

+0

@Phoeniz_uy:我建议你同时试试,同时检查SQL和性能... –

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

你肯定希望做一个selectToList() ING虽然,因为这只会选择从SQL需要的数据,但ToList()后做会做它在内存中。

+1

第二次使用LinqPad,迄今为止调整Linq查询的最快方法。 – Mant101