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

问题描述 投票:0回答:1

有以下课程;

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

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

c# nhibernate linq-to-entities linq-to-nhibernate
1个回答
0
投票

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

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))
© www.soinside.com 2019 - 2024. All rights reserved.