我正在使用Linq2NHibernate从多个查询中的表中获取一堆数据。虽然该表包含10列,但我在查询中仅使用其中3个,之后我不需要其他属性。然而,生成的SQL在每个查询上加载(如预期的)所有属性。
优化查询的推荐方法是什么?
将更轻的实体变体用于优化查询是否有意义?即创建一个只包含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
答案 0 :(得分:1)
由于您尚未发布实际查询,因此很难看出问题所在。通常,您只使用所需的字段填充数据传输对象(DTO)。这将解决一个问题。至于您的LINQ查询,包括域实体中的每个字段,您必须使用投影。预测将告诉NHibernate只获取那些不包括你域的其余部分的内容。请注意,我不使用LINQ查询NHibernate,但概念是相同的。
顺便说一句,我同意MatíasFidemraizer你应该考虑使用新的QueryOver API。