2012-09-14 97 views
8

如何使用QueryOver API執行以下LINQ到NHibernate查詢。這將獲取數據庫中所有項目記錄的列表,並將狀態爲「已返回」的項目放置到列表末尾。狀態是映射到數據庫中的nvarchar的Enum。QueryOver API OrderBy使用案例

var workList = session.Query<Item>() 
       .OrderBy(i=> i.Status == Status.Returned ? 1 : 0) 
       .ToList(); 

的SQL相當於是

SELECT * 
FROM Item 
ORDER BY case when Status='Returned' then 1 else 0 end 

我有,當然試過

var workList = session.QueryOver<Item>() 
       .OrderBy(i => i.Status == Status.Returned ? 1 : 0).Asc 
       .ToList(); 

,但我得到以下

InvalidOperationException異常:變量 'I' 型 'MyProject.Model.Entities.Item'從範圍「」引用,但 沒有定義

我不能在這種情況下,一些其他功能使用,因爲一個問題的LINQ。

回答

13

你應該使用Projections.Conditional在這裏,而不是罰款:

Item itemAlias = null; 

var workList = 
    session.QueryOver<Item>(() => itemAlias) 
     .OrderBy(Projections.Conditional(
      Restrictions.Where(() => itemAlias.Status == Status.Returned), 
      Projections.Constant(1), 
      Projections.Constant(0))).Asc 
     .List(); 

這是一個有點冗長,但它應該完成這項工作。

+0

工作很好,雖然別名在這種情況下做什麼? –

+2

它只是讓你引用'Restrictions.Where'調用中的表格。如果你願意的話,你也可以嘗試'限制.Where (i => i.Status == Status.Returned)',但是在那個版本中我得到了奇怪的結果。 –

+0

正是我需要的,謝謝。 – iamserious