构造按布尔条件排序的NHibernate查询

时间:2011-12-09 15:35:23

标签: nhibernate

我有两个实体:Client和AccountPlan,它们之间的关系为1到0..1。我想获取我的客户端,首先由拥有AccountPlan的客户端订购,然后由不拥有AccountPlan的客户端订购。当我尝试以下Linq到Nhibernate查询时:

        return NHibernateSession.Current.Query<Client>()
            .Where(x => x.SalesRepId == id)
            .OrderBy(x => x.AccountPlan == null);

我收到QuerySyntaxException并带有以下消息:

  

{“抛出了类型'Antlr.Runtime.NoViableAltException'的异常。   [.OrderBy(。凡(NHibernate.Linq.NhQueryable`1 [FIS.AccountManagement.Core.Domain.Client]   引用((x,)=&gt;(等于(x.SalesRepId,p1))),),引用((x,)=&gt;   (Equal(x.AccountPlan,))),)]“}

这是两个实体之间的映射关系,如果这很重要:

    public ClientMap()
    {
        HasOne(x => x.AccountPlan).PropertyRef(r => r.Client);
    }


    public AccountPlanMap()
    {
        DynamicInsert();

        References(x => x.Client, "EntityID");
    }

有没有人知道来自NHibernate的无数API之一的查询将实现我想要的?提前致谢。

3 个答案:

答案 0 :(得分:1)

一次往返的两个查询连在一起

var clientsWithPlan = NHibernateSession.Current.Query<Client>()
    .Where(x => x.SalesRepId == id)
    .Where(x => x.AccountPlan != null)
    .Future();

var clientsWithoutPlan = NHibernateSession.Current.Query<Client>()
    .Where(x => x.SalesRepId == id)
    .Where(x => x.AccountPlan == null)
    .Future();

return clientsWithPlan.Concat(clientsWithoutPlan);

答案 1 :(得分:1)

使用条件运算符:

return NHibernateSession.Current.Query<Client>()
    .Where(x => x.SalesRepId == id)
    .OrderBy(x => x.AccountPlan == null ? 1 : 0);

答案 2 :(得分:0)

作为一种解决方法,您可以从数据库中无序检索所有客户端,然后使用LINQ to对象在应用程序中执行排序:

var clients = NHibernateSession.Current.QueryOver<Client>()
    .Where(x => x.SalesRepId == id)
    .Fetch(x => x.Account).Eager
    .List();

return clients.OrderBy(x => x.AccountPlan == null);