C# Nhibernate-eager fetchmode,集合的外部联接-顺序子句导致第二个不必要的查询

C# Nhibernate-eager fetchmode,集合的外部联接-顺序子句导致第二个不必要的查询,c#,nhibernate,orm,eager-loading,C#,Nhibernate,Orm,Eager Loading,当我通过一个查询运行以下代码以获取产品的3个集合时:pricelist、Materials和Colors。 当product.PriceList访问集合时,我就有了数据 ProductDTO Product = (ProductDTO)session.CreateCriteria(typeof(ProductDTO)) .Add(Expression.IdEq(code)) .SetFetchMode("Colors", Fetch

当我通过一个查询运行以下代码以获取产品的3个集合时:pricelist、Materials和Colors。 当product.PriceList访问集合时,我就有了数据

ProductDTO Product = (ProductDTO)session.CreateCriteria(typeof(ProductDTO))
                .Add(Expression.IdEq(code))
                .SetFetchMode("Colors", FetchMode.Eager)
                .SetFetchMode("PriceList", FetchMode.Eager)
                .SetFetchMode("Materials", FetchMode.Eager)
                .UniqueResult();
问题是我需要按Num的顺序列出集合价格表,我使用以下代码:

ProductDTO Product = (ProductDTO)session.CreateCriteria(typeof(ProductDTO))
                .Add(Expression.IdEq(code))
                .SetFetchMode("Colors", FetchMode.Eager)
                .SetFetchMode("PriceList", FetchMode.Eager)
                .SetFetchMode("Materials", FetchMode.Eager)
                .UniqueResult();
或下一个代码:

ProductDTO Product = (ProductDTO)session.CreateCriteria(typeof(ProductDTO))
                .Add(Expression.IdEq(code))
                .SetFetchMode("Colors", FetchMode.Eager)
                .SetFetchMode("PriceList", FetchMode.Eager)
                .SetFetchMode("Materials", FetchMode.Eager)
                .CreateCriteria("PriceList").AddOrder(Order.Asc("Num"))
                .UniqueResult();
此限制意味着,当我访问collection product.PriceList时,强制执行一个不必要的PriceList新查询(而不是with order子句)。 我偶尔会看到“延迟初始化集合角色失败,没有会话或会话已关闭”

如果有人能告诉我这件事,请告诉我。我喜欢在单个查询中解决问题,并了解会发生什么。 我发现了类似的帖子,比如一篇使用“notfound=ignore”的帖子。我使用的是NHibernate2.1.2

我复制了以下部分映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="DotAR.M.Logica.DTO.ProductDTO, DotAR.M" table="products">
        <id name="Code" type="string" unsaved-value="null">
            <generator class="assigned" />
       </id>
       <set name="PriceList" lazy="true" inverse="true" cascade="all">
            <key column="code" />
            <one-to-many class="DotAR.M.Logica.DTO.ProductPriceNumDTO, DotAR.M" />
       </set>

       <set name="Colors" lazy="true" inverse="true" cascade="all">
            <key column="code" />
            <one-to-many class="DotAR.M.Logica.DTO.ProductColorDTO, DotAR.M" />
       </set>
       <set name="Materials" lazy="true" inverse="true" cascade="all">
            <key column="code" />
            <one-to-many class="DotAR.M.Logica.DTO.ProductMaterialDTO, DotAR.M" />
       </set>
    </class>
</hibernate-mapping>

每个集合都有一个复合id。例如ProductColor

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
   <class name="DotAR.M.Logica.DTO.ProductColorDTO, DotAR.M" table="product_colors">
        <composite-id unsaved-value="any">
            <key-property name="Code" type="string" />
            <key-property name="Name" type="string" />
        </composite-id>
        <many-to-one name="Product" column="code" class="DotAR.M.Logic.DTO.ProductDTO, DotAR.M" insert="false" update="false" />
 </class>
</hibernate-mapping>

.CreateCriteria(“PriceList”).AddOrder(Order.Asc(“Num”)
->NH将订单应用于
ProductDTO.Num

否则它基本上就是一个角落。由于PriceList是一个没有顺序的集合,所以即使来自数据库的排序结果也会得到未排序的clientside。您可能想要的是:

// using linq
var orderedPrices = Product.PriceList.Ordery(price => price.Num).ToList();
.CreateCriteria(“PriceList”).AddOrder(Order.Asc(“Num”)
->NH将订单应用于
ProductDTO.Num

否则它基本上就是一个角落。由于PriceList是一个没有顺序的集合,所以即使来自数据库的排序结果也会得到未排序的clientside。您可能想要的是:

// using linq
var orderedPrices = Product.PriceList.Ordery(price => price.Num).ToList();