2012-02-01 19 views
1

當我使用單個查詢運行以下代碼以獲取產品的3個集合時:價格表,材料和顏色。 當product.PriceList訪問集合,我有數據Nhibernate - eager fetchmode,outer join - 用於收集的訂單子句導致第二個不必要的查詢

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(); 

這一限制意味着,當我訪問集合product.PriceList強制執行新查詢價目表(不與秩序條款)是是不必要的。 我偶爾會「無法初始化懶洋洋地收集角色沒有會話或會話已關閉」

請如果有人能指導我一下。我喜歡在單個查詢中解決並理解發生了什麼。 我發現像使用「not-found = ignore」的類似帖子。我使用NHibernate 2.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> 

回答

1

.CreateCriteria("PriceList").AddOrder(Order.Asc("Num")) - > NH施加爲了ProductDTO.Num

否則它基本上是一個noop。由於PriceList是一個沒有訂單的集合,即使從數據庫中排序的結果也會得到未排序的客戶端。你可能想要的是:

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