【问题标题】:Recommended way of optimizing Linq2NHibernate优化 Linq2NHibernate 的推荐方式
【发布时间】: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


【解决方案1】:

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

顺便说一句,我同意 Matías Fidemraizer 的观点,即您应该考虑使用新的 QueryOver API。

【讨论】:

  • 谢谢,我写完帖子就知道了。它实际上是如此明显,它伤害了我的眼睛。 :) 关于 QueryOver,现在我没有看到重构整个应用程序的意义,因为它是“推荐”切换的。 LINQ 现在足够稳定,至少对于我需要它。代码重构得很好,松耦合,我从 NHibernate 获得了我需要的所有 ORM 好处。我检查了所有发出的 SQL 以了解发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
相关资源
最近更新 更多