2011-12-09 39 views
1

我有两个实体:Client和AccountPlan,它们具有1到0..1的关系。我想取回我的客户,首先由拥有AccountPlan的客户订购,然后由不具有客户的客户订购。当我尝试下面的LINQ to NHibernate的查询:构建NHibernate通过布尔条件查询订单

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

我出现以下消息QuerySyntaxException:

{“异常类型的 'Antlr.Runtime.NoViableAltException' 被抛出 [。 OrderBy(.Where(NHibernate.Linq.NhQueryable`1 [FIS.AccountManagement.Core.Domain.Client], Quote((x,)=>(Equal(x.SalesRepId,p1))),)Quote(( x)=> (Equal(x.AccountPlan,))),)]“}

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

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


    public AccountPlanMap() 
    { 
     DynamicInsert(); 

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

有谁从NHibernate的无数的一个API,将完成我想要知道的查询?提前致谢。在一个往返

回答

1

两个查询concated一起

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); 
+0

巧妙。谢谢! – Vish

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

使用条件运算符:

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

谢谢!我正在写'query.OrderBy(x => x.NextFireTime == null)',它不工作,但'query.OrderBy(x => x.NextFireTime == null?1:0)'工作正常 – Lars