我有两个课程Product
和ProductDetail
(见下文)
我想在同一个查询中,在Code
对象的Product
和Name
的{{1}}进行搜索。结果应该是ProductDetail
列表。
我试过了:
Product
当搜索与var search = "stringToSearch";
var list = _session.QueryOver<Product>()
.Fetch(x => x.ProductDetails).Eager.Future<Product>()
.Where(
x => x.Code.StartsWith(search) ||
x.ProductDetails.First().Name.StartsWith(search))
.ToList();
媒体资源以及第一条Code
的{{1}}匹配时,该查询会给我正确的结果,
但我想搜索Name
的所有记录。
我该怎么做?
谢谢,
ProductDetail
答案 0 :(得分:2)
要查询两个实体,您只需将它们与别名连接,然后使用这些别名来查询属性
// alias definition
Product productAlias = null;
ProductDetail detailAlias = null;
var list = session.QueryOver<Product>(() => productAlias)
.JoinAlias(() => productAlias.ProductDetails, () => detailAlias)
.Where(() => productAlias.Code.StartsWith(search))
.And(() => detailAlias.Name.StartsWith(search))
.List();
不幸的是,nHibernate在此语法中不允许使用string.StartsWith
,因此您必须优化查询以使用.WhereRestrictionOn
和IsLike
,如下所示:
var list = session.QueryOver<Product>(() => productAlias)
.JoinAlias(() => productAlias.ProductDetails, () => detailAlias)
.WhereRestrictionOn(() => productAlias.Code).IsLike(search, MatchMode.Start)
.AndRestrictionOn(() => detailAlias.Name).IsLike(search, MatchMode.Start)
.List();
:编辑:刚发现你想要一个OR查询,要做到这一点,我们必须结合Where语句中的限制,如:
var listWithOr = session.QueryOver<Product>(() => productAlias)
.JoinAlias(() => productAlias.ProductDetails, () => detailAlias)
.Where(Restrictions.On(() => productAlias.Code).IsLike(search, MatchMode.Start)
|| Restrictions.On(() => detailAlias.Name).IsLike(search, MatchMode.Start))
.List();
希望这有帮助
<强>:EDIT2:强> 上面的查询不会给你一个明显的结果,一些产品可以多次出现在列表中,如果需要你必须使它成为一个独特的结果......
使用简单的NHibernate.Linq
语句可以实现相同的查询(已经有明显的结果):
var list2 = session.Query<Product>()
.Where(prod => prod.Code.StartsWith(search) ||
prod.ProductDetails.Any(detail => detail.Name.StartsWith(search))
);