4

假设如下:

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 的订单,并且其产品集合也应过滤为名称以字母 P 开头的产品?

4

4 回答 4

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>();
于 2010-02-26T14:39:26.690 回答
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();

然后执行标准并获得结果。

于 2009-07-29T13:07:46.210 回答
0

我不知道您必须编写的代码,但指向正确的方向:

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

关键似乎是:

.SetResultTransformer(CriteriaUtil.AliasToEntityMap)

该文档显示了猫和小猫的示例。

请注意,前两个查询返回的 Cat 实例所持有的 kittens 集合没有被条件预先过滤!如果您只想检索符合条件的小猫,则必须使用 SetResultTransformer(CriteriaUtil.AliasToEntityMap)。

于 2009-07-22T14:48:54.343 回答
0

对集合的映射设置过滤器。

<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%"/>
于 2009-07-27T10:46:15.997 回答