【发布时间】:2011-05-06 12:59:52
【问题描述】:
我正在使用 Linq2NHibernate 在多个查询中从表中获取一堆数据。尽管该表包含 10 列,但我在查询中只使用了其中的 3 个,之后我不需要其他属性。尽管如此,生成的 SQL 仍会在每个查询上加载(如预期的那样)所有属性。
优化查询的推荐方法是什么?
将更轻的实体变体用于优化查询是否有意义? IE。创建一个仅包含 2 个属性的实体,并将其映射到同一个表?如果实际的实体继承自较轻的实体,它不应该造成太多混乱,NHibernate 最终只会获取较小的数据子集。
这是常见的做法,还是有更好的方法来优化查询?我宁愿坚持使用 LINQ,因为它现在在整个项目中使用。
[编辑]
正如 Mike 在下面回答的那样,解决方案非常明显:实际预计的 DTO 将规定要获取的必要属性。因此,我将提供一个示例,以使其更清楚:
换句话说,这个查询将加载所有属性:
/* fetch actual entities */
var results = session
.Query<Food>()
.Where(p => p.Proteins < 100 && p.Fats < 50);
/* ... results in: */
SELECT Id, Proteins, Fats, Carbs, Name, Whatever
FROM [Food] WHERE Proteins < 100 AND Fats < 50
虽然这个会生成查询以仅获取投影属性:
/* fetch light DTOs */
var results = session
.Query<Food>()
.Where(p => p.Proteins < 100 && p.Fats < 50)
.Select(p => new
{
Proteins = p.Proteins,
Fats = p.Fats
});
/* generated sql: */
SELECT Proteins, Fats
FROM [Food] WHERE Proteins < 100 AND Fats < 50
【问题讨论】:
-
您考虑过切换到 QueryOver 吗?不建议在较新的 NH 版本中使用 NH2Linq。
-
@Matías:恕我直言,我认为这不会改变 SQL 的生成方式;它仍然需要获取所有属性来获取实体吗?但是现在我不想浪费时间更改一堆代码,LINQ 到目前为止运行良好(除了提到的性能问题)。
-
但问题是 NHtoLinq 不再受支持...这只是一个建议 :)
标签: .net sql nhibernate optimization linq-to-nhibernate