2013-06-05 115 views
1

我有一个表中的用户列表,当在表上执行搜索时,我希望以搜索关键字开头的用户名显示在列表顶部,其次是拥有在其用户名中搜索关键字。按优先级排序nhibernate或sql server

例如,考虑用户名列表:

rene 
irene 
adler 
leroy 
Argog 
harry 
evan 

我提供的“建议”,在搜索框中的用户类型,当他们试图寻找其他用户。如果用户在搜索框中键入va,他们往往会寻找用户vain,但由于我按用户名排序,升序排列,evan总是排在最前面。我会想是订购像这样:

寻找VA

vain 
evan 

寻找重新

rene 
Irene 

搜索AR

Argog 
harry 

当然,如果他们再输入一个字符,它会进一步缩小。

想一想,这就是我想要做的 - 把用搜索键开头的用户名放在最上面(如果多个用户名以搜索键开头,按字母顺序排序)。然后,如果所需数量的用户名未完成,请按字母顺序追加包含搜索关键字的其他用户名。

我分页的SQL本身的结果 - 我用nhibernate查询执行任务。通过if the required number of usernames isn't complete,我的意思是如果页面大小为10,并且我只有7个用户名,请在其中包含包含searchkey的其他用户名。

我目前无法看到在一个查询中执行所有操作的方法。是否必须将查询分为两部分并联系db两次以完成此操作?或者有什么方法可以排序字符串的位置?

任何有关如何有效地做到这一点的提示将是非常有用的。 - 我甚至不能想到在普通的SQL中会这样做的查询。

谢谢。


解决方案

accepted answer把我推在正确的方向,这是最终为我工作:

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

回答

4

在普通的SQL,你可以精心一个ORDER BY子句,如:

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

cour你可以使用变量/字段名称。

不知道你的问题的其余部分。

+0

啊,这是一个非常有趣的解决这个问题的办法,谢谢,我会考虑这个转换现在查询过。谢谢! – LocustHorde

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; 
+0

嗨,你一定错过了我的编辑几秒钟..我最终得到了一些非常相似的东西,但是当我尝试使用matchmode时,它说了一些关于第三个参数是可空字符的东西,我找不出什么通过那里。不过谢谢你! – LocustHorde