2012-09-14 23 views
8

QueryOver APIを使用して、次のLINQ to NHibernateクエリを実行する方法を教えてください。これは、DBからItemのすべてのレコードのリストを取得し、ステータスが "Returned"のItemをリストの最後に置きます。ステータスは、データベース内のnvarcharにマップされる列挙型です。私はもちろんしましQueryOver API OrderBy with Case

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'呼び出しの中でテーブルを参照することができます。もしあなたが好きであれば 'Restrictions.Where (i => i.Status == Status.Returned)'を試してみることもできますが、そのバージョンでは奇妙な結果が出ました。 –

+0

まさに私が必要としていた、感謝します。 – iamserious