2011-12-09 77 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