当前位置: 首页 > 面试题库 >

渴望在NHibernate 3.0 Linq中加载多个兄弟姐妹和孙子(表兄弟?)的良好行为

惠诚
2023-03-14
问题内容

我正在尝试使用NHibernate 3.0的LINQ接口执行以下操作。我想查询一个对象(使用一些Where子句),并加载一些子代和孙代。目前,我正在这样做:

var results = session.Query<Thing>()
                     .Where(...)
                     .Fetch(x => x.SubThingA)
                     .ThenFetch(st => st.SubSubThingA)

                     .Fetch(x => x.SubThingB)
                     .ThenFetch(st => st.SubSubThingB)

                     // etc...

但是,这将导致所有子孙之间的笛卡尔积(每个结果行包含许多列)。这在这里由“
ayende”讨论。另一方面,我得到了一次往返,这与拆分查询然后进行合并不同。

在仍使用NHibernate的LINQ接口的情况下,如何更好地(在SQL和性能方面)做到这一点?

(一方面,我注意到当您使用Fetch时,当前ToFuture方法不起作用)

非常感谢!


问题答案:

尽管Diego的答案是在NHibernate中做这些事情的公认方法,但是我真的对这种方法不满意。我不想仅仅因为我可能需要以某些方式来检索它们而为我的对象定义显式契约。另外,我并不总是要序列化它们。此外,在许多情况下,我知道最佳性能
始终 是一次往返以获取所有数据。

我最终使用的解决方案是实现一个函数,该函数接受根对象上的(类型安全的)表达式列表,例如

x => x.Child.GrandChild1
x => x.Child.GrandChild2Collection.SubInclude(c => c.GreatGrandChild)

其中SubInclude是IEnumerable的扩展方法,该方法在解析这些表达式时使用。

我解析此表达式列表,并针对每个表达式(x,x.Child,x.Child.GrandChild1)的每个子路径在根类型上构建NHibernate条件查询:

var queryOver = session.QueryOver<T>().Where( ...expression to select root objects... );
for every subpath in the current expression:
    queryOver.RootCriteria.SetFetchMode(subPath, FetchMode.Eager)

queryOver.RootCriteria
         .SetResultTransformer(new DistinctRootEntityResultTransformer())

queryOver.Future()

对于列表中的每个表达式重复此操作。最后一行确保此紧迫的获取将包括在接下来发生的任何往返中。然后,我在根对象T上进行实际查询,并且该会话在同一往返过程中自动执行获取我在表达式中传递的每个路径所需的所有查询。

查询是针对每个表达式路径分别执行的,因此没有笛卡尔积的问题。

最重要的
是,这并非简单的壮举。我可以按原样发布太多代码。我更喜欢EF4.1的Include(expression)API,它可以自动完成所有这些工作。



 类似资料:
  • 基本上是新的反应,我有点困惑如何正确地传递组件之间的状态。我发现一个类似的问题已经出现了——将表单元素状态传递给兄弟/父元素的正确方法是什么?但是我想知道你能否给我一个关于下面代码的具体答案。 目前应用的结构包括: 父组件- 2个孩子:和 目标是对我的Meteor收藏进行异步搜索,并仅显示与搜索词匹配的

  • 我试图定位页面上的特定元素,但无法找到要使用的适当Xpath。 以下是HTML(注意每个div的位置可能不同): 我可以通过以下操作(使用JAVA)成功定位标签: 并且我可以成功地定位第一个元素下的第一个输入(但我可能并不总是想要第一个元素): 所以问题是(i)输入的名称标记和值总是不同的,所以它们不能用来选择元素;(ii)带有姓氏标签的div可能不总是第二个;(iii)标签和span是同一级别的

  • 前面讲解了存储普通树的双亲表示法和孩子表示法,本节来讲解最后一种常用方法—— 孩子兄弟表示法。 图 1 普通树示意图 树结构中,位于同一层的节点之间互为兄弟节点。例如,图 1 的普通树中,节点 A、B 和 C 互为兄弟节点,而节点  D、E 和 F 也互为兄弟节点。 孩子兄弟表示法,采用的是链式存储结构,其存储树的实现思想是:从树的根节点开始,依次用链表存储各个节点的孩子节点和兄弟节点。 因此,该

  • 问题内容: 我有两个同级元素,每个元素都包含动态内容。 在某些情况下,然后会有更多的内容,反之亦然。我希望第二个元素的高度始终等于第一个元素的高度。如果的高度更大,则其高度将溢出div,因此可以滚动。 有什么方法可以通过Flexbox做到这一点? 问题答案: 是的,有可能。让兄弟姐妹单独设置最大高度,并设置其他人的和,然后根据规范将其扩展到他们兄弟姐妹的高度。没有绝对定位。没有设置任何元素的高度。

  • 面试过了,面试体验非常棒! 面试官是我老乡,人特别好~ 面经如下: 1.自我介绍 2.为什么不考研 3.JVM内存结构 4.arraylist和linkedlist的区别 5.string,stringbuffer,stringbuilder的区别 6.锁在项目中的应用 7.三次握手四次挥手 8.项目问题和亮点 9.反问 总而言之,还是很不错的啦! #哪些公司面试官让你印象深刻?##我的实习求职记

  • 我有一个左右兄弟姐妹,如下所示: 我想从根节点遍历到最后一个节点,遍历函数如下: 正如我所理解的,如果节点有一个子节点,那么指针指向它的子节点,否则指向同级节点(下一个)。在这种情况下,当指针指向元素6时,它将转到根- 下面是重新创建树的代码: