Я искал в Интернете несколько часов, чтобы попытаться получить ответ на этот вопрос, но безрезультатно.
То, что я пытаюсь сделать, - это количество несоответствий 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 */))