如何查询与NHibernate的标准API和实体子属性仅加载匹配谓词条件的子属性(How to qu

2019-09-20 03:19发布

假设如下:

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 +

Answer 1:

我会去这个用的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();

然后执行该标准和获得的结果。



Answer 2:

最简单的方法是使用一个别名:

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


Answer 3:

我不知道你的代码会写,但在正确的方向的一个点:

http://www.nhforge.org/doc/nh/en/index.html#querycriteria-associations (14.4)

关键似乎是:

.SetResultTransformer(CriteriaUtil.AliasToEntityMap)

该文件显示了猫和小猫的例子。

需要注意的是,通过前两次的查询返回的Cat实例举行的小猫集合是没有被条件预过滤! 如果你希望只获得符合条件的kittens,你必须使用SetResultTransformer(CriteriaUtil.AliasToEntityMap)。



Answer 4:

建立在集合的映射的过滤器。

<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