假设如下:
public class Order
{
public virtual int OrderId {get;set}
public virtual ISet<Product> Products {get;set}
}
public class Product
{
public virtual int ProductId {get;set}
public virtual string ProductName {get;set}
}
您如何查询中使用的标准API,以便返回仅与特定的OrderID订单和它的产品系列也应该渗透到产品的名字开始与lettter P +
我会去这个用的DetachedCriteria:
DetachedCriteria crit = DetachedCriteria.For<Order>();
crit.Add(Restrictions.Eq("OrderId",orderID);
crit.CreateCriteria("Products","products");
crit.Add(Restrictions.Like("products.ProductName","P%");
crit.List();
然后执行该标准和获得的结果。
最简单的方法是使用一个别名:
var productIdToSelect = 9;
var crit = Session.CreateCriteria(typeof(Order));
crit.CreateAlias("Product", "prod");
crit.Add(Expression.Eq("prod.Id", productIdToSelect));
var result = crit.List<Order>();
我不知道你的代码会写,但在正确的方向的一个点:
http://www.nhforge.org/doc/nh/en/index.html#querycriteria-associations (14.4)
关键似乎是:
.SetResultTransformer(CriteriaUtil.AliasToEntityMap)
该文件显示了猫和小猫的例子。
需要注意的是,通过前两次的查询返回的Cat实例举行的小猫集合是没有被条件预过滤! 如果你希望只获得符合条件的kittens,你必须使用SetResultTransformer(CriteriaUtil.AliasToEntityMap)。
建立在集合的映射的过滤器。
<filter name="letterFilter" condition="ProductName like ':letterSupplied'"/>
然后运行前订单查询启用过滤器
session.EnableFilter("letterFilter").SetParameter("letterSupplied", "P%");
然后运行查询
Order ord = session.CreateCriteria<Order>().Add(Restrictions.IdEq(suppliedId)).UniqueResult<Order>();
需要注意的是在过滤器定义的单引号可以不要求,也是我将用提供的参数%符号作为我不知道NH会如何反应就像一个过滤器
<filter name="letterFilter" condition="ProductName like ':letterSupplied%'"/>
要么
<filter name="letterFilter" condition="ProductName like :letterSupplied%"/>
文章来源: How to query a subproperty with NHibernate’s criteria api and the entity to load only the subproperties matching a predicate condition