NHibernate AND'ing 动态分离

标签 nhibernate

我已经在网上搜索了几个小时,试图找到这方面的答案,但无济于事。

我想做的是“N”个析取,以根据空格分隔的查询优化搜索。

我有一个“统一体”,它可以是一个人或组织的任意组合,也可以是多人/组织的任意组合,或者以上的任意组合。

因此,如果我搜索“Smith”,我想匹配名称为“Smith”的任何公司或人员,这很容易。

但是,如果有人要键入“Smith w”并希望匹配不同的组合(或人物和组织)。

因此,我只会对同时拥有公司或拥有 smith 的人以及组织的 Unity(人员和/或组织的组合)产生影响

 ICriteria query = Session.CreateCriteria(typeof(Unity), "u")
                .CreateCriteria("Organisations", "o", JoinType.LeftOuterJoin)
                .CreateCriteria("u.People", "p", JoinType.LeftOuterJoin)
                .SetResultTransformer(new DistinctRootEntityResultTransformer())
                .SetMaxResults(10);

        Disjunction keywordsCriteria = Restrictions.Disjunction();

        if (searchTerms.Contains(' ')) {
            foreach (var keyword in searchTerms.Split(' ')) {
                var term = string.Format("%{0}%", keyword);
                keywordsCriteria
                    .Add(Restrictions.Like("p.FirstName", term))
                    .Add(Restrictions.Like("p.LastName", term))
                    .Add(Restrictions.Like("o.Name", term));
            }

        }
        else
        {
            var term = string.Format("%{0}%", searchTerms);
            keywordsCriteria
                .Add(Restrictions.Like("p.FirstName", term))
                .Add(Restrictions.Like("p.LastName", term))
                .Add(Restrictions.Like("o.Name", term));
        }
        query.Add(keywordsCriteria);

        return query.List<Unity>();

这导致

where(p2_.Name1 like '%smith%' /* @p0 */
     or p2_.Name3 like '%smith%' /* @p1 */
     or o1_.EntityName like '%smith%' /* @p2 */
     or p2_.Name1 like '%w%' /* @p3 */
     or p2_.Name3 like '%w%' /* @p4 */
     or o1_.EntityName like '%w%' /* @p5 */)

但是我想要制作的是下面的

WHERE  ((p2_.Name1 like '%smith%' /* @p0 */
     or p2_.Name3 like '%smith%' /* @p1 */
     or o1_.EntityName like '%smith%' /* @p2 */)
     AND(
     p2_.Name1 like '%w%' /* @p3 */
     or p2_.Name3 like '%w%' /* @p4 */
     or o1_.EntityName like '%w%' /* @p5 */))

最佳答案

用这个

if (!searchTerms.Contains(' '))
{
    Disjunction keywordsCriteria = Restrictions.Disjunction();
    var term = string.Format("%{0}%", searchTerms);
    keywordsCriteria
        .Add(Restrictions.Like("p.FirstName", term))
        .Add(Restrictions.Like("p.LastName", term))
        .Add(Restrictions.Like("o.Name", term));
    query.Add(keywordsCriteria);
}
else
{
    Conjunction conjunction = Restrictions.Conjunction();
    foreach (var keyword in searchTerms.Split(' '))
    {
        Disjunction disjunction = Restrictions.Disjunction();
        var term = string.Format("%{0}%", keyword);
            disjunction
            .Add(Restrictions.Like("p.FirstName", term))
            .Add(Restrictions.Like("p.LastName", term))
            .Add(Restrictions.Like("o.Name", term));
        conjunction.Add(disjunction);
    }
    query.Add(conjunction);
}

关于NHibernate AND'ing 动态分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655369/

相关文章:

c# - FluentNhibernate - HasMany 与复合键的关系

nhibernate - NHibernate中Session.Clear()的用途是什么?

c# - NHibernate 将实体映射到通用查找表

c# - 尝试删除多对多关系中两个对象之间的连接时出现的问题

c# - NHibernate Linq Query Where(x => x is Base Class) 没有得到派生对象

nhibernate - 急切地使用 NHibernate 加载子集合

c# - Fluent Nhibernate - 通过分组连接查询

NHibernate Eager 使用 StatelessSession 进行多个级别的获取

sql - 流畅的 NHibernate : SchemaExport and SchemaUpdate

.net - 定期 - 无法将索引 Y 处的 Unicode 字符 X 转换为指定的代码页