推荐的优化Linq2NHibernate的方法

时间:2011-05-06 12:59:53

标签: .net sql nhibernate optimization linq-to-nhibernate

我正在使用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

1 个答案:

答案 0 :(得分:1)

由于您尚未发布实际查询,因此很难看出问题所在。通常,您只使用所需的字段填充数据传输对象(DTO)。这将解决一个问题。至于您的LINQ查询,包括域实体中的每个字段,您必须使用投影。预测将告诉NHibernate只获取那些不包括你域的其余部分的内容。请注意,我不使用LINQ查询NHibernate,但概念是相同的。

顺便说一句,我同意MatíasFidemraizer你应该考虑使用新的QueryOver API。