按首选项nhibernate或sql server排序

时间:2013-06-05 15:32:19

标签: sql tsql nhibernate queryover

我有一个表中的用户列表,当在表上执行搜索时,我希望以搜索键开头的用户名出现在列表的顶部,然后是在用户名中有搜索键的用户。 / 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();

2 个答案:

答案 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;