NHibernate在多对多关系上搜索一些属性

时间:2013-10-06 09:06:45

标签: c# nhibernate many-to-many queryover

我有两个课程ProductProductDetail(见下文)

我想在同一个查询中,在Code对象的ProductName的{​​{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

1 个答案:

答案 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,因此您必须优化查询以使用.WhereRestrictionOnIsLike,如下所示:

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