我有一个表中的用户列表,当在表上执行搜索时,我希望以搜索键开头的用户名出现在列表的顶部,然后是在用户名中有搜索键的用户。 / p>
例如,请考虑用户名列表:
rene
irene
adler
leroy
Argog
harry
evan
当用户在尝试搜索其他用户时在搜索框中键入内容时,我会提供“建议”。如果用户在搜索框中输入va
,他们往往会查找用户vain
,但因为我按用户名按升序排序用户evan
总是排在最前面。我想要的是这样订购:
搜索va
vain
evan
搜索重新
rene
Irene
搜索ar
Argog
harry
当然,如果再输入一个字符,它将会进一步缩小。
考虑到这一点,这就是我想要做的事情 - 将以搜索键开头的用户名放在最前面(如果多个用户名以搜索键开头,则按字母顺序排序)。然后,如果所需的用户名数量不完整,请按字母顺序追加包含搜索关键字的其他用户名。
我在sql本身中对结果进行分页 - 我正在使用nhibernate queryover来执行任务。到if the required number of usernames isn't complete
,我的意思是如果页面大小为10而我只有7个用户名,则附加其他包含searchkey的用户名。
我目前无法在一个查询中看到完成所有这些操作的方法..我是否必须将查询分成两部分并联系数据库两次以完成此操作?还是有办法我可以用字符串的位置排序?
有关如何有效地执行此操作的任何提示都将非常有用。 - 我甚至无法想到在普通的sql中执行此操作的查询。
感谢。
解决方案
accepted answer推动了我朝着正确的方向前进,这最终对我有用:
.OrderBy(Projections.Conditional(
Restrictions.Where(r => r.Username.IsLike(searchKey + "%")),
Projections.Constant(0),
Projections.Constant(1))).Asc();
答案 0 :(得分:4)
在纯SQL中,您可以创建一个ORDER BY子句,例如:
ORDER BY CASE WHEN field LIKE 'VA%' THEN 0
WHEN field LIKE '%VA%' THEN 1
ELSE 2
END
当然,您可以使用变量/字段名称。
不确定你的其他问题。
答案 1 :(得分:1)
QueryOver基于Goat_CO的想法:
session.QueryOver<YourClass>()
.OrderBy(
Projections.Conditional(
Restrictions.Like(Projections.Property<YourClass>(x => x.Pro),
searchString,
MatchMode.Anywhere),
Projections.Constant(0),
Projections.Constant(1)))
.Asc;