Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用NHibernate连接多个1对多关系表_C#_Linq_Nhibernate - Fatal编程技术网

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在进行

我有以下表格:

  • 应用
  • 组成部分
  • 位置
  • 一个应用程序可以有1到多个组件 一个应用程序可以有1到多个位置

    当我尝试使用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