2010-09-03 35 views
1

J'ai une requête qui a une clause Order By. Le code SQL généré à partir de NHibernate ressemble àEmpêchez NHibernate d'aliaser dans ORDER BY

ORDER BY coalesce(x.Company as x__.Company, y.Company) asc 

Ceci échoue lorsque 'as' n'est pas autorisé dans la clause Order by dans MS SQL Server. Est-ce que je peux empêcher l'aliasing?

La requête de critères que je l'ai écrit ressemble à:

var orderBy = Projections.SqlFunction("coalesce", NHibernateUtil.String,  
         Projections.ProjectionList() 
         .Add(Projections.Property("x.Company")) 
         .Add(Projections.Property("y.Company"))); 

var order = Order.Asc(orderBy); 
criteria.AddOrder(order); 

Répondre

2
Projections.SqlFunction("coalesce", 
         NHibernateUtil.String, 
         Projections.Property("x.Company"), 
         Projections.Property("y.Company")); 

Les paramètres à la coalescence (ou tout autre) fonction doit être passée séparément (en fait, comme un réseau de params), non fusionnées en une ProjectionList.

+0

Thanks Diego! Cela a aidé. J'ai été frappé avec celui-ci pendant un moment. – WorldIsRound

+0

Salut, je suis confronté à un problème similaire. Mais au lieu de cela, j'ajoute des colonnes de tri conditionnelles dans la liste des projections et en dernier en fournissant à Orderby() où obtenir ce "AS" en cassant le SQL. J'ai besoin d'avoir tout le tri par colonnes en utilisant de nombreuses conditions. Une idée? – Ammad

0

J'ai eu des problèmes similaires ennuyeux. Vous devrez peut-être dériver une classe de PropertyProjection et utiliser celle de Projections.Property(). Substituez la méthode ToSqlString et supprimez la clause AS.

+0

Tim, Quelle devrait être la priorité? J'ai essayé quelque chose comme: public override SqlString ToSqlString (critères ICriteria, int loc, ICriteriaQuery criteriaQuery, IDictionary enabledFilters) {return new SqlString (this.PropertyName); } Mais a lancé une exception: System.ArgumentException était non gérée par le code utilisateur message = longueur doit être supérieure ou égale à 0 – WorldIsRound

+0

Ou pour cette matière, dans la dérogation que j'ai fourni retour nouvelle SqlString (nouvelle chaîne [] {this.PropertyName}); J'ai reçu la même ArgumentException – WorldIsRound