【问题标题】:NHibernate multi table query returning same row more than onceNHibernate 多表查询多次返回同一行
【发布时间】:2012-03-16 03:46:26
【问题描述】:

以下 nhibernate 查询引起了我的问题,因为它返回同一行的次数多于一次,因为子表有不止一行与提供的条件匹配。我想知道的是在 nhibernate 中执行相同查询但只获取 DataMappingBase 中的每一行一次的最有效/最佳实践。返回同一行的多个结果会破坏我返回的结果数量,因为我尝试将其限制为 25,但有时我会得到同一行 25 次。

MappedID id = null;
DataMappingBase mapBase = null;
NameDetails name = null;
dmbs = mappingSession.QueryOver<DataMappingBase>(() => mapBase)
   .JoinAlias(() => mapBase.IDs, () => id).WhereRestrictionOn(() => id.SecondaryDataIDType).IsNull()
   .JoinAlias(() => mapBase.Names, () => name).WhereRestrictionOn(() => name.Name).IsInsensitiveLike(request.Filter, MatchMode.Anywhere)
   .Take(request.MaxResults)
   .List();

我目前正在考虑将上面的查询转换为分离查询并删除“take”子句并让它只返回匹配行的 ID 并将其用于从“DataMappingBase”中选择的子查询中行 ID 在子查询返回的 id 中,但我不确定这是否是最好的方法。

【问题讨论】:

  • 您使用的是 ISession 还是 IStatelessSession ?

标签: nhibernate


【解决方案1】:

我不确定,但你可以这样做:

MappedID id = null;
DataMappingBase mapBase = null;
NameDetails name = null;
dmbs = mappingSession.QueryOver<DataMappingBase>(() => mapBase)
   .JoinAlias(() => mapBase.IDs, () => id).WhereRestrictionOn(() => id.SecondaryDataIDType).IsNull()
   .JoinAlias(() => mapBase.Names, () => name).WhereRestrictionOn(() => name.Name).IsInsensitiveLike(request.Filter, MatchMode.Anywhere)
   .Take(request.MaxResults)
   // add this
   .TransformUsing(Transformers.DistinctRootEntity)
   .List();

【讨论】:

  • 谢谢您知道这是否比使用子查询更有效?我在上面谈论的子查询确实有效,但由于我希望在其他频繁运行的查询中遇到这个问题,我希望采用更有效的选项/最佳实践。
  • 通常使用连接查询比子查询更有效,我认为它更好用。
  • 谢谢,今晚我会更新我的代码。感谢您快速详细的回答
  • 我认为这可能会更好philliphaydon.com/2011/01/… 我认为这是因为我的理解是 distinct 需要收集所有结果然后计算出不同的结果,这与仅选择相比非常慢首先是相关的前 x 行。 (一直在与工作中的 DBA 交谈,以找出 sql 方面的优势,并尽我所能将其映射到 nhibernate)
猜你喜欢
  • 2017-06-02
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多