如何使用NHibernate查询子属性’;s条件api和实体,以仅加载与谓词条件匹配的子属性

如何使用NHibernate查询子属性’;s条件api和实体,以仅加载与谓词条件匹配的子属性,nhibernate,criteria,icriteria,Nhibernate,Criteria,Icriteria,假设: 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} } 公共类秩序 { 公共

假设:

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}
}
公共类秩序
{
公共虚拟int-OrderId{get;set}
公共虚拟ISet产品{get;set}
}
公共类产品
{
公共虚拟int ProductId{get;set}
公共虚拟字符串ProductName{get;set}
}

您将如何使用criteria api进行查询,以便仅返回具有特定orderid的订单,并且其产品集合也应被筛选为名称以Letter p开头的产品?

我不知道您必须编写的代码,但有一点是正确的:

(14.4)

关键似乎是:

.SetResultTransformer(CriteriaUtil.AliasToEntityMap)
文档显示了一个猫和小猫的例子

请注意,前两个查询返回的Cat实例所持有的kittens集合并没有根据条件进行预筛选!如果只希望检索符合条件的小猫,则必须使用SetResultTransformer(CriteriaUtil.AliasToEntityMap)


在集合的映射上设置筛选器

<filter name="letterFilter" condition="ProductName like ':letterSupplied'"/>
然后运行查询

Order ord = session.CreateCriteria<Order>().Add(Restrictions.IdEq(suppliedId)).UniqueResult<Order>();
Order Order=session.CreateCriteria().Add(Restrictions.IdEq(suppliedId)).UniqueResult();
请注意,过滤器定义中的单引号可能不是必需的,而且我将%符号与提供的参数一起放置,因为我不知道NH会如何反应类似于

<filter name="letterFilter" condition="ProductName like ':letterSupplied%'"/>


我会用一个分离的标准来处理这个问题:

DetachedCriteria crit = DetachedCriteria.For<Order>();

crit.Add(Restrictions.Eq("OrderId",orderID);
crit.CreateCriteria("Products","products");
crit.Add(Restrictions.Like("products.ProductName","P%");

crit.List();
DetachedCriteria crit=DetachedCriteria.For();
标准添加(Restrictions.Eq(“OrderId”,OrderId);
标准(“产品”、“产品”);
添加限制(如“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>();
var productIdToSelect=9;
var crit=Session.CreateCriteria(typeof(Order));
CreateAlias(“产品”、“产品”);
标准添加(Expression.Eq(“prod.Id”,productIdToSelect));
var result=crit.List();

谢谢你的评论eyston,我确实遵循了你在文章中提到的同一个示例。但是,将该代码与mysql方言(我的用例)一起使用会出现SQL不可用错误…我不想认为这样简单的操作不可能…如果有人能够提供一个有效的示例,那么肯定有一些东西足够了,那太好了!你运行的是NH的哪个版本?我在2.0.1上试用了一到两个月,nut从未使用ResultTransformer让它工作过。现在对我来说有点模糊,但我记得,我发现它是一个bug/缺少的功能,可能会在2.1.0版本中解决/实现。我明天可能会研究它在工作中,如果不是太忙:)谢谢你的回复,问Gerhallas-我也将不得不用新版本做一个旋转,看看我从中得到了什么非常有趣的方法-没有尝试过这个,要测试它,谢谢捷豹,你最后用了哪一个?
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>();