当我使用单个查询运行以下代码以获取产品的3个集合时:价格表,材料和颜色。 当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的顺序列出集合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();
或下一个代码:
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 FORCE一个新的QUERY for PriceList(不带有order子句),这是不必要的。 我偶尔会“懒得初始化集合角色没有会话或会话关闭”
如果有人可以指导我的话。我喜欢在一个查询中解决并了解会发生什么。 我发现类似的帖子就像使用“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>
答案 0 :(得分:1)
.CreateCriteria("PriceList").AddOrder(Order.Asc("Num"))
- &gt; NH将订单应用于ProductDTO.Num
。
否则它基本上是一个noop。由于PriceList是一个没有订单的集合,即使从数据库中排序的结果也会得到未排序的客户端。你可能想要的是:
// using linq
var orderedPrices = Product.PriceList.Ordery(price => price.Num).ToList();