8

QueryOver API を使用して、次の LINQ to NHibernate クエリを実行するにはどうすればよいですか。これにより、DB から Item のすべてのレコードのリストが取得され、ステータスが「Returned」の Item がリストの最後に配置されます。ステータスは、データベース内の nvarchar にマップされる Enum です。

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: タイプ 'MyProject.Model.Entities.Item' の変数 'i' がスコープ '' から参照されていますが、定義されていません

この場合、他の機能に問題があるため、LINQ を使用できません。

4

1 に答える 1

14

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();

少し冗長ですが、仕事を終わらせる必要があります。

于 2012-09-14T16:58:08.737 に答える