QueryOver API OrderBy使用Case

Pea*_*yle 8 nhibernate queryover

如何使用QueryOver API执行以下LINQ to NHibernate查询.这将从DB获取Item的所有记录的列表,并将状态为"Returned"的Items放置到列表的末尾.状态是Enum,它映射到数据库中的nvarchar.

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

SQL等价物是

SELECT *
FROM Item
ORDER BY case when Status='Returned' then 1 else 0 end
Run Code Online (Sandbox Code Playgroud)

我当然试过了

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

但我得到以下内容

InvalidOperationException:从范围''引用的'MyProject.Model.Entities.Item'类型的变量'i',但它未定义

我不能使用LINQ,因为在这种情况下有一些其他功能的问题.

And*_*ker 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();
Run Code Online (Sandbox Code Playgroud)

它有点冗长,但它应该完成工作.

  • 它只是让你引用`Restrictions.Where`调用里面的表.您也可以尝试`Restrictions.Where <Item>(i => i.Status == Status.Returned)`如果您愿意,但我在该版本中得到了奇怪的结果. (2认同)