2008-09-22 6 views
8

je dois faire ce qui suit aux fins de la pagination une requête dans NHibernate:Comment puis-je sélectionner le nombre (*) d'un résultat de NHibernate sous-requête

Select count(*) from 
(Select e.ID,e.Name from Object as e where...) 

J'ai essayé ce qui suit,

select count(*) from Object e where e = (Select distinct e.ID,e.Name from ...) 

et j'obtiens une exception nHibernate indiquant que je ne peux pas convertir Object en int32.

Des idées sur la syntaxe requise?

EDIT

La sous-requête utilise une clause distincte, je ne peux pas remplacer le e.ID, e.Name avec Count(*) parce Count(*) distinct n'est pas une syntaxe valide et distinct count(*) est dénuée de sens.

+0

semble que nous devons voir l'application/C# code après appel retourne –

Répondre

0

Avez-vous besoin de e.Id, e.Name?

juste faire

select count (*) de l'objet où .....

+0

Désolé, j'oublié d'ajouter la stipulation que la sous-requête était distincte. – ForCripeSake

1

Voici un projet de la façon dont je le fais:

Requête:

public IList GetOrders(int pageindex, int pagesize) 
{ 
    IList results = session.CreateMultiQuery() 
     .Add(session.CreateQuery("from Orders o").SetFirstResult(pageindex).SetMaxResults(pagesize)) 
     .Add(session.CreateQuery("select count(*) from Orders o")) 
     .List(); 
    return results; 
} 

ObjectDataSource:

[DataObjectMethod(DataObjectMethodType.Select)] 
public DataTable GetOrders(int startRowIndex, int maximumRows) 
{ 
    IList result = dao.GetOrders(startRowIndex, maximumRows); 
    _count = Convert.ToInt32(((IList)result[1])[0]); 

    return DataTableFromIList((IList)result[0]); //Basically creates a DataTable from the IList of Orders 
} 
+0

le problème provient du fait que j'ai besoin d'un compte (*) des résultats distincts de la première requête, comme un compte (*) dans la requête ne produit pas le même nombre (3 résultats vs 54 résultats dus à plusieurs jointures. – ForCripeSake

+0

Ah, c'est vrai. Désolé, j'ai manqué que –

2

Résolu ma propre question en modifiant Geir-Tore réponse de .....

IList results = session.CreateMultiQuery() 
     .Add(session.CreateQuery("from Orders o").SetFirstResult(pageindex).SetMaxResults(pagesize)) 
     .Add(session.CreateQuery("select count(distinct e.Id) from Orders o where...")) 
     .List(); 
    return results; 
14
var session = GetSession(); 
var criteria = session.CreateCriteria(typeof(Order)) 
        .Add(Restrictions.Eq("Product", product)) 
        .SetProjection(Projections.CountDistinct("Price")); 
return (int) criteria.UniqueResult(); 
0

Je préfère,

public IList GetOrders(int pageindex, int pagesize, out int total) 
    { 
      var results = session.CreateQuery().Add(session.CreateQuery("from Orders o").SetFirstResult(pageindex).SetMaxResults(pagesize)); 

      var wCriteriaCount = (ICriteria)results.Clone()); 

      wCriteriaCount.SetProjection(Projections.RowCount()); 

      total = Convert.ToInt32(wCriteriaCount.UniqueResult()); 


      return results.List(); 
    } 
14

NHibernate 3.0 permet requête Linq.

Essayez cette

int count = session.QueryOver<Orders>().RowCount(); 
+1

L'extension QueryOver n'est pas réellement le fournisseur Linq, mais une bonne option pour obtenir un compte –

Questions connexes