gpt4 book ai didi

NHibernate AND'ing 动态分离

转载 作者:行者123 更新时间:2023-12-02 00:38:19 24 4
gpt4 key购买 nike

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

我想做的是“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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com