C# 如何使用NHibernate连接多个1对多关系表
我有以下表格:C# 如何使用NHibernate连接多个1对多关系表,c#,linq,nhibernate,C#,Linq,Nhibernate,我有以下表格: 应用 组成部分 位置 一个应用程序可以有1到多个组件 一个应用程序可以有1到多个位置 当我尝试使用NHibernate运行连接时,如下所示: IEnumerable<Application> applications = Session.Query<Application>() .FetchMany(r => r.Components) .FetchMany(r => r.Positions) 我认为NHibernate在进行
IEnumerable<Application> applications = Session.Query<Application>()
.FetchMany(r => r.Components)
.FetchMany(r => r.Positions)
我认为NHibernate在进行多个1对多连接时会负责规范化集合,但它似乎不起作用
关于如何允许我使用NHibernate LINQ进行多个1对多联接而不获取这些重复记录,有什么建议或解决方法吗?请查看结果转换器。您应该能够将其添加到您的查询中,并使其消除重复条目
SetResultTransformer(CriteriaSpecification.DistinctRootEntity)
如果要使用延迟加载,还应该能够保留FetchMany方法。但是,这可能会导致运行许多查询。这不是一个解决方案,而是一个比解决方案性能更好的解决方案 单独的查询可能比一个大查询执行得更好,因为它们检索的数据更少。您可以使用
.Future()
一个包含2个应用程序的大型结果集,其中包含2个组件和2个位置=24个元素
ApplicationColumns ComponentColumns PositionColumns
AppA ColA PosA
AppA ColB PosA
AppA ColA PosB
AppA ColB PosB
AppB ColC PosC
AppB ColD PosC
AppB ColC PosD
AppB ColD PosD
三个小结果集,包含2个应用程序,包含2个组件和2个位置=10个元素
ApplicationColumns
AppB
AppB
ComponentColumns
ColA
ColB
ColC
ColD
PositionColumns
PosA
PosB
PosC
PosD
选择N+1和外部连接不是唯一的选择。组件和位置之间是否存在任何关系?这个答案可能很有趣,我希望避免延迟加载,因为有多个查询。好的,虽然我不是100%确定,但转换器仍应防止延迟加载。试试看,让我知道。谢谢,因为我感谢你的上述观点。当您使用future运行多个查询时,如何将其恢复为单个对象图,因为我想显示一个表,其中显示一行appName、component info和position info。当对象关联时,NHiberante会在内存中自动创建对象图。我猜2个查询(将结果增加到16个元素)最适合描述的情况:使用获取的列加载应用程序和使用获取的位置加载应用程序。我仍然不太明白。在这种情况下,您将返回两个结果(每个查询一个)。每个结果将是一个应用程序列表(一个将包括组件的完全连接,一个将包括位置的完全连接)。如果我想在应用程序列表中循环并提取组件和位置信息,您是说nhibernate将允许两个结果都读取组件信息和位置信息,而无需返回数据库??是的,一旦加载了集合,就不需要执行查询。您可能需要在应用程序列表中进行区分。返回哪个应用程序列表并不重要,它们都应该引用相同的实例。
ApplicationColumns
AppB
AppB
ComponentColumns
ColA
ColB
ColC
ColD
PositionColumns
PosA
PosB
PosC
PosD