2013-06-05 108 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