简体   繁体   English

如何获取所有实体-Nhibernate选择具有多级深度的n + 1

[英]How to fetch all entities - Nhibernate select n+1 with multi level deep

To explain my question let's assume I've got these two classes: 为了解释我的问题,我们假设我有以下两个类:

public class Grandfather
{
     private int Id;
     private int Version;
     private IList<Father> Childrens; 
}

public class Father
{
    private int Id;
    private int Version;
    private IList<double> ChildrensAges;
    private IList<double> ChildrenGradesOnMath;
    private IList<int> ChildrenNumberOfFriends;
}

The Mapping files are: 映射文件为:

for Grandfather: 对于祖父:

 <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
     namespace="Entities" assembly="Entities">
     <class name="Grandfather" table="Grandfather">
     <id name="Id" column="Id" type="Int32" unsaved-value="0">
         <generator class="assigned" />
        </id>
         <version name="Version" column="Version" type="Int32" unsaved-value="0" access="property"/>
         <bag name="Childrens" table="Childrens" cascade="all-delete-orphan" fetch="join" lazy="false">
            <key column="GrandfatherOwnerId"/>
            <one-to-many class="Father"
       </bag>
    </class>
    </hibernate-mapping>

for Father: 对于父亲:

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
     namespace="Entities" assembly="Entities">
     <class name="Father" table="Father">
     <id name="Id" column="Id" type="Int32" unsaved-value="0">
         <generator class="assigned" />
     </id>
     <version name="Version" column="Version" type="Int32" unsaved-value="0" access="property"/>
     <list name="ChildrensAges" table="ChildrensAges" fetch="join" lazy="false">
        <key column="ChildrensAgesDBId"/>
        <index column="Ordinal"/>
        <element column="Value" type="System.Double"/>
    </list>
    <list name="ChildrenGradesOnMath" table="ChildrenGradesOnMath" fetch="join" lazy="false">
        <key column="ChildrenGradesOnMathDBId"/>
        <index column="Ordinal"/>
        <element column="Value" type="System.Double"/>
    </list>
    <list name="ChildrenNumberOfFriends" table="ChildrenNumberOfFriends" fetch="join" lazy="false">
        <key column="ChildrenNumberOfFriendsDBId"/>
        <index column="Ordinal"/>
        <element column="Value" type="System.Int"/>
    </list>
</class>
</hibernate-mapping>

I want to fetch all Grandfathers from the DB. 我想从数据库中获取所有祖父。 When I use the query (on DB with 10,000 grandfathers, each grandfather has one child): 当我使用查询时(在有10,000个祖父的数据库上,每个祖父都有一个孩子):

IList queryEntities = session.CreateQuery("from Grandfather").List();

It generate 10,000*5 queries and it take too much time. 它生成10,000 * 5个查询,并且花费太多时间。

What is the best way to fetch all the data (I need it all so it have to be eager) in one query? 在一个查询中获取所有数据的最佳方法是什么(我需要它,所以必须急切)?

Thanks in advanced :-) 提前致谢 :-)

Use FetchMany 使用FetchMany

something like the following 类似以下内容

var grandfathers = (from grin session.Query<Grandfather>()
            select gr)
            .FetchMany(f => f.Childrens)
            .ThenFetch(fc = > fc.ChildrensAges)
            .ToList();

and you might extend this to ThenFetch or ThenFetchMany to get items on Father. 您可以将其扩展到ThenFetch或ThenFetchMany以在父亲上获取项目。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM