2008-09-22 8 views
8

Ich brauche die folgenden für die Zwecke des Paging eine Abfrage in nHibernate zu tun:Wie wähle ich den Count (*) ein nHibernate Subquery der Ergebnisse

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

ich folgende versucht habe,

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

und ich bekomme eine nHibernate Exception sagen, dass ich nicht Objekt in int32 konvertieren kann.

Irgendwelche Ideen zur erforderlichen Syntax?

EDIT

Die Subquery eine bestimmte Klausel verwendet, kann ich die e.ID nicht ersetzen, e.Name mit Count(*) weil Count(*) distinct ist keine gültige Syntax und distinct count(*) ist bedeutungslos.

+0

scheint, dass wir die Anwendung/C# -Code sehen, müssen nach Aufruf –

Antwort

0

Benötigen Sie e.Id, e.Name?

tun nur

select count (*) von Object wo .....

+0

Leider gibt, ich vergaß die Bedingung hinzuzufügen, dass die Unterabfrage verschieden war. – ForCripeSake

1

Hier ist ein Entwurf, wie ich es tun:

Abfrage:

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; 
} 

Object:

[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

Das Problem rührt von der Tatsache her, dass ich ein Count (*) der eindeutigen Ergebnisse der ersten Abfrage benötige, da ein count (*) innerhalb der Abfrage nicht die gleiche Anzahl ergibt (3 Ergebnisse gegenüber 54 Ergebnissen aufgrund mehrerer Joins).) – ForCripeSake

+0

Ah, richtig. Sorry, ich habe das verpasst –

2

Meine eigene Frage Gelöst Geir-Tore Antwort durch Modifizieren .....

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

ich es bevorzugen,

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 ermöglicht Linq-Abfrage.

Versuchen Sie, diese

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

Die QueryOver-Erweiterung ist nicht wirklich der Linq-Anbieter, aber eine gute Option, um eine Anzahl zu erhalten –