NHibernate и динамическая дизъюнкция - PullRequest
3 голосов
/ 07 сентября 2010

Я искал в Интернете несколько часов, чтобы попытаться получить ответ на этот вопрос, но безрезультатно.

То, что я пытаюсь сделать, - это количество несоответствий AND 'N' для уточнения поиска на основе запроса с пробелами.

У меня есть «Единство», которое может быть любой комбинацией одного человека или организации, нескольких людей / организации или любой комбинации вышеперечисленного.

Поэтому, если я ищу «Смит», я хочу сопоставить любые компании ИЛИ людей с именем «Смит», просто.

Однако, если кто-то наберет «Смит w» и захочет совпадения в различных комбинациях (ИЛИ на Персоне и Организации).

Так что я бы получил удар только по 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 */))

Ответы [ 2 ]

2 голосов
/ 07 сентября 2010

используйте это

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);
}
1 голос
/ 08 сентября 2010

Спасибо за ответ, работает чарм, просто нужно было изменить один маленький бит, мне нужно было создать новый дизъюнкт для каждого цикла, или он будет продолжать добавляться.

Не могу поверить, что не понял этого!

if (searchTerms.Contains(' ')) {
            foreach (var keyword in searchTerms.Split(' ')) {
                var term = string.Format("%{0}%", keyword);
                Disjunction keywordsCriteria = Restrictions.Disjunction(); // <<--
                keywordsCriteria
                    .Add(Restrictions.Like("p.FirstName", term))
                    .Add(Restrictions.Like("p.LastName", term))
                    .Add(Restrictions.Like("o.Name", term));
                query.Add(keywordsCriteria);
            }
        }
        else
        {
            var term = string.Format("%{0}%", searchTerms);
            Disjunction keywordsCriteria = Restrictions.Disjunction(); // <<--
            keywordsCriteria
                .Add(Restrictions.Like("p.FirstName", term))
                .Add(Restrictions.Like("p.LastName", term))
                .Add(Restrictions.Like("o.Name", term));
            query.Add(keywordsCriteria);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...