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 查询