NHibernate QueryOver实体具有IList属性子属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NHibernate QueryOver实体具有IList属性子属性相关的知识,希望对你有一定的参考价值。

有以下课程;

public class Customer{
  ....
  ....
  IList<Receipt> Receipts { get; set; }
}

public class Receipt{
  ....
  IList<SoldProduct> Products { get; set; }
}

说到这里,我的问题是我正在尝试查询已购买特定产品的客户。当我尝试执行以下代码时,我得到一个NullReferenceException。

Customer c = null;
Receipt r = null;
SoldProduct sP = null;

var queryOver = Session.QueryOver(() => c)
    .JoinAlias(() => c.Receipts, () => r)
    .JoinAlias(() => r.SoldProducts, () => sP)
    .Where(() => c.Name.IsLike(query.Search, MatchMode.Anywhere) ||
                           c.Surname.IsLike(query.Search, MatchMode.Anywhere) ||
                           c.Address.IsLike(query.Search, MatchMode.Anywhere) ||
                           c.Receipts.Select(receipt => 
                           receipt.SoldProducts.Select(product => product.Product.OldId.ToString()))
                           .SingleOrDefault().Single().IsLike(query.Search, MatchMode.Anywhere))

我现在才被卡住了。我可能会错过这里的关键点,如果是这样,请告诉我。如果实际上有一种更简单的方法来执行此查询,我将非常感谢任何帮助。

答案

尝试将过滤器应用于产品别名:

Customer c = null;
Receipt r = null;
SoldProduct sP = null;
Product p = null;

var queryOver = Session.QueryOver(() => c)
    .JoinAlias(() => c.Receipts, () => r)
    .JoinAlias(() => r.SoldProducts, () => sP)
    .JoinAlias(() => sp.Product, () => p)
    .Where(() => c.Name.IsLike(query.Search, MatchMode.Anywhere) ||
                           c.Surname.IsLike(query.Search, MatchMode.Anywhere) ||
                           c.Address.IsLike(query.Search, MatchMode.Anywhere) ||
                           p.OldId.ToString().IsLike(query.Search, MatchMode.Anywhere))

以上是关于NHibernate QueryOver实体具有IList属性子属性的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate QueryOver 与 Fetch 产生多个 sql 查询和数据库命中

nHibernate QueryOver:过滤主元素长度和子元素长度

NHibernate 将 sql 查询转换为 NHibernate QueryOver 查询

如何在 Nhibernate 中对子集合进行 QueryOver

NHibernate QueryOver 两次加入一个集合

NHibernate 3.0:没有使用QueryOver的FirstOrDefault()?