2011-12-09 3 views
1

J'ai deux entités: Client et AccountPlan, qui ont une relation de 1 à 0..1. Je voudrais récupérer mes clients, commandés d'abord par les clients qui ont un compte, puis par les clients qui n'en ont pas. Lorsque je tente la Linq suivante pour interroger Nhibernate:Construire une requête NHibernate qui commande par une condition booléenne

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

Je reçois un QuerySyntaxException avec le message suivant:.

{ "exception de type 'Antlr.Runtime.NoViableAltException' a été jeté [. OrderBy (.Where (NHibernate.Linq.NhQueryable`1 [FIS.AccountManagement.Core.Domain.Client], Citer ((x,) => (Egal (x.SalesRepId, p1))),, Citation ((x,) => (Equal (x.AccountPlan,))),)] "}

Voici la relation de correspondance entre les deux entités, si c'est important:

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


    public AccountPlanMap() 
    { 
     DynamicInsert(); 

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

Est-ce que quelqu'un sait d'une requête de l'une des API myriade de NHibernate qui accomplira ce que je veux? Merci d'avance.

Répondre

1

deux requêtes dans un aller-retour pour concated ensemble

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

Ingenious. Je vous remercie! – Vish

0

Pour contourner ce problème, vous pouvez récupérer tous les clients de la base de données non ordonnée, puis effectuez la commande dans l'application à l'aide LINQ aux objets:

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

Utilisation d'un opérateur conditionnel:

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

Merci! J'écrivais 'query.OrderBy (x => x.NextFireTime == null)' et il ne fonctionnait pas, mais 'query.OrderBy (x => x.NextFireTime == null? 1: 0)' fonctionne très bien – Lars

Questions connexes