1

我在表中有一个用户列表,在对表执行搜索时,我希望以搜索键开头的用户名出现在列表顶部,然后是用户名中包含搜索键的用户。

例如,考虑用户名列表:

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 执行此操作的查询..

谢谢。


解决方案

接受的答案将我推向了正确的方向,这最终对我有用:

.OrderBy(Projections.Conditional(
    Restrictions.Where(r => r.Username.IsLike(searchKey + "%")),
    Projections.Constant(0),
    Projections.Constant(1))).Asc();
4

2 回答 2

4

在纯 SQL 中,您可以制作一个 ORDER BY 子句,例如:

ORDER BY CASE WHEN field LIKE 'VA%' THEN 0
              WHEN field LIKE '%VA%' THEN 1
              ELSE 2
         END

当然,您可以改用变量/字段名称。

不确定您的其余问题。

于 2013-06-05T15:35:54.253 回答
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;
于 2013-06-05T16:48:32.290 回答