2009-11-25 5 views
2

Avant de poser cette question, j'ai parcouru un certain temps sur Google, mais je n'ai trouvé aucune information pertinente à ce sujet.NHibernate appelant SELECT DISTINCT ON de PostgresSQL()

Mon problème est simple:

Je critères NHibernate et projection et je suis en train de mettre DISTINCT ON (colonne)

Mon code pour la projection suit:

 criteria.SetProjection(
      Projections.ProjectionList() 
      .Add(Projections.Distinct(Projections.Property("ID"))) 
      .Add(Projections.Property("A")) 
      .Add(Projections.Property("B")) 
     ); 

Cette génère SQL suivant (bit simplifié):

SELECT DISTINCT ID, A, B FROM ABC ORDER BY A 

rformance si cette requête est très très mauvaise.

J'ai optimisé mon SQL qui tourne beaucoup plus vite et ressemble à ceci:

SELECT DISTINCT ON (A) ID, A, B FROM ABC ORDER BY A 

Y at-il de toute façon je peux faire NHibernate générer du SQL que je viens de le montrer? Ce problème peut-il être résolu avec les dialectes de NHibernate?

Dans l'attente de vos commentaires! Merci beaucoup!

Répondre

0

Ce n'est pas la solution la plus élégante, par tous les moyens mais je me demande si vous pouvez accomplir ce dont vous avez besoin en utilisant un "SQLProjection"? Je suis un gars de Java, de sorte que le code ne peut être exactement ici, mais l'approche suivante ressemble à ça marche pour moi en utilisant Postgres:

criteria.SetProjection(
    Projections.ProjectionList() 
    .Add(Projections.SqlProjection("DISTINCT ON(A) ID")) 
    .Add(Projections.Property("A")) 
    .Add(Projections.Property("B")) 
); 

qui génère la requête SQL optimisé vous avez donné à votre question. Encore une fois, cette approche peut ne pas fonctionner si vous faites quelque chose de très dynamique, mais c'est une façon de s'attaquer au problème.