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()
中执行。
我的问题是,如果在性能水平上做得更好:
- 与Lambda表达式的查询?保持
select new {....}
部分。 -
ToList()
后select new {....}
部分的查询?
你建议我做什么?
将其更改为lambda表达式不会影响性能-它们将被编译成相同的SQL。我建议使用像LinqPad这样的工具来帮助确定正在生成的SQL。
你肯定想在 ToList()
之前做一个select
,因为这只会从SQL中选择你需要的数据,但是在ToList()
之后做它会在内存中做。
-
这是完全一样的。查询表达式基本上被转换为非查询表达式的等效物。
-
你需要使用
select new { tableA, tableB }
或类似的东西,这样你就可以在ToList
之后使用两个变量…但它可能会比慢:- 所有字段将从数据库中提取,而不仅仅是那些使用
- 投影(包括Sum等)都将在从数据库中获取值之后发生,而不是在数据库中。这很可能涉及到更多的数据库请求,访问
tableA.TableC
等。
您应该查看生成的SQL,在SQL分析器中运行它以找出慢的地方,考虑更多的索引等。