Nhibernate QueryOver API OrderBy用例

Nhibernate QueryOver API OrderBy用例,nhibernate,queryover,Nhibernate,Queryover,如何使用QueryOverAPI执行以下LINQ到NHibernate查询。这将从数据库中获取项的所有记录的列表,并将状态为“Returned”的项放在列表的末尾。状态是映射到数据库中nvarchar的枚举 var workList = session.Query<Item>() .OrderBy(i=> i.Status == Status.Returned ? 1 : 0) .ToList(); 我当然试过了

如何使用QueryOverAPI执行以下LINQ到NHibernate查询。这将从数据库中获取项的所有记录的列表,并将状态为“Returned”的项放在列表的末尾。状态是映射到数据库中nvarchar的枚举

var workList = session.Query<Item>()
                .OrderBy(i=> i.Status == Status.Returned ? 1 : 0)
                .ToList();
我当然试过了

var workList = session.QueryOver<Item>()
                .OrderBy(i => i.Status == Status.Returned ? 1 : 0).Asc
                .ToList();
var workList=session.QueryOver()
.OrderBy(i=>i.Status==Status.Returned?1:0).Asc
.ToList();
但我得到了以下信息

InvalidOperationException:类型为的变量“i” “MyProject.Model.Entities.Item”引用自范围“”,但它是 未定义


我无法使用LINQ,因为在这种情况下,某些其他功能出现问题。

您可以使用
投影。请改为使用有条件的

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();
Item itemalas=null;
变量工作列表=
session.QueryOver(()=>itemAlias)
.OrderBy(Projections.Conditional)(
限制。其中(()=>itemAlias.Status==Status.Returned),
投影。常数(1),
投影。常数(0))。Asc
.List();

虽然有点冗长,但它应该可以完成任务。

工作得很好,尽管别名在这种情况下做了什么?它只允许您引用
限制内的表。Where
调用。如果您愿意,您也可以尝试
限制。其中(i=>i.Status==Status.Returned)
,但我在该版本中得到了奇怪的结果。太棒了。我使用它对一个表进行排序,该表包含一些姓氏的空字符串。这里没有足够的空间,但本质上,通过Projections.Conditional和by(x->x.LastName).Asc做相反的操作,然后你就可以开始比赛了。现在可以使用QueryOver和Skip/Take进行分页。嗨,Andrew,我面临类似的情况,用户提供的序列需要实现或按订单进行。当使用投影列表时,我按顺序得到“AS”,并导致错误。多次使用static.Orderby()时,它可以工作,但在if()条件下使用时,SQL中没有Orderby。知道如何实现这一点吗?如果我们有多个类似于case的case,Status='Returned'时为case,那么当另一个字段=1时为1,当othertablefield>2时为'this'时为9,否则为0,那么该怎么办
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();