我正在使用Linq2NHibernate从多个查询中的表中获取一堆数据。尽管表格中包含10列,但我在的查询中仅使用了其中的3个,之后我不需要其他属性。生成的SQL仍然加载(如预期的)所有属性在每个查询上。推荐的优化Linq2NHibernate的方法
什么是优化查询的推荐方法?
将较轻的实体变体用于优化查询有意义吗?即创建一个只包含2个属性的实体,并将其映射到同一个表中?如果实际的实体从较轻的实体继承,它不应该做太多的混乱,NHibernate最终只会获取较小的数据子集。
这是常见的做法,还是有更好的方法来优化查询?我宁愿坚持使用LINQ,因为现在在整个项目中都使用它。
[编辑]
麦克下面回答,解决的办法是很明显的:实际投射的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。 – 2011-05-06 13:04:31
@Matías:恕我直言,我不认为它会改变生成SQL的方式;它仍然需要获取所有属性来获取实体?但现在我不想浪费时间更改一堆代码,LINQ目前工作良好(除了提到的性能问题)。 – Groo 2011-05-06 13:10:58
但问题是NHtoLinq不再支持了......这只是一个建议:) – 2011-05-06 13:16:35