2011-05-06 49 views
1

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

您是否考虑切换到QueryOver?在新的NH版本中不推荐使用NH2Linq。 – 2011-05-06 13:04:31

+0

@Matías:恕我直言,我不认为它会改变生成SQL的方式;它仍然需要获取所有属性来获取实体?但现在我不想浪费时间更改一堆代码,LINQ目前工作良好(除了提到的性能问题)。 – Groo 2011-05-06 13:10:58

+0

但问题是NHtoLinq不再支持了......这只是一个建议:) – 2011-05-06 13:16:35

回答

1

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

另外我同意MatíasFidemraizer,您应该考虑使用新的QueryOver API。

+0

谢谢,我完成了我的文章后就明白了。这实际上很明显,它伤害了我的眼睛。 :)关于QueryOver,现在我没有看到重构整个应用程序的重点,因为它是“推荐”切换。现在LINQ已经足够稳定了,至少对于我需要的东西来说。代码重构良好,松散耦合,并且我从NHibernate获得了我需要的所有ORM优势。我检查了所有发出的SQL以关注发生的事情。 – Groo 2011-05-06 14:06:51