大佬教程收集整理的这篇文章主要介绍了渴望在NHibernate 3.0 Linq中加载多个兄弟姐妹和孙子(表兄弟?)的良好行为,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
尽管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,它可以自动完成所有这些工作。
我正在尝试使用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方法不起作用)
非常感谢!
以上是大佬教程为你收集整理的渴望在NHibernate 3.0 Linq中加载多个兄弟姐妹和孙子(表兄弟?)的良好行为全部内容,希望文章能够帮你解决渴望在NHibernate 3.0 Linq中加载多个兄弟姐妹和孙子(表兄弟?)的良好行为所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。