8

如何使用 QueryOver API 执行以下 LINQ to NHibernate 查询。这会从数据库中获取项目的所有记录的列表,并将状态为“已返回”的项目放在列表的末尾。状态是一个 Enum,它映射到数据库中的 nvarchar。

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 回答