我一直在网上搜索几个小时试图得到答案,但无济于事。
我想要做的是和'N'量的Disjunctions来根据空白分隔查询来优化搜索。
我有一个'Unity',可以是单个人或组织,也可以是多个人/组织,或上述任意组合的任意组合。
因此,如果我搜索'史密斯',我希望匹配任何公司或人名为'史密斯',轻松。
但是,如果有人输入'Smith w'并希望在不同的组合上进行匹配(或者在人员和组织上)。
因此,我只会因为一个公司或一个有史密斯的人和一个组织的人(和/或组织的组合)受到欢迎
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 */))
答案 0 :(得分:2)
使用此
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 :(得分:1)
感谢您的回复,有点魅力,只需改变一点,我必须为每个循环创建一个新的Disjunction,否则它会不断附加到。
我无法相信我没有接受它!
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);
}