0

Lassen Sie uns annehmen, dass ich diese einfache n-n Tabelle haben (zwischen people und product):Zeilenanzahl von eindeutigen IDs

//id people_id product_id 
    1   1   1 
    2   1   3 
    3   1   5 
    4   2   1 

Und dieser Klasse (bereits abgebildet):

public class PeopleProduct 
{ 
    public virtual int TableId { get; set; } //Mapped to id 
    public virtual int PeopleId { get; set; } //Mapped to people_id 
    public virtual Product Product { get; set; } //Mapped to product_id 
} 

Wie Sie können siehe, es gibt zwei people, die erste mit 3 products und die zweite mit nur 1.

Wie kann ich die Anzahl der eindeutigen people_id mit CreateCriteria erhalten?

ich zur Zeit versucht, dies zu verwenden: mit

var crit = StatelessSession.CreateCriteria<PeopleProduct>() 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Count<PeopleProduct>(c => c.PeopleId)) 
     .Add(Projections.Group<PeopleProduct>(g => g.PeopleId))); 

var count = Convert.ToInt64(crit.UniqueResult()); 

Aber es gibt immer eine Liste mit einem Array [zählen, id]:

[3, 1] and [2, 1] 

Dies ist nicht die beste Ergebnis, da diese Tabelle tausende von people_id zurückgeben könnte.

Antwort

1

Verwendung CountDistinct.

var numberOfDistinctPeople = StatelessSession.CreateCriteria<PeopleProduct>() 
    .SetProjection(Projections.CountDistinct<PeopleProduct>(c => c.PeopleId)) 
    .UniqueResult(); 

By the way, wissen Sie, dass Sie QueryOver verwenden können, die gleich mit einer besseren Syntax ist? HQL/Linq ist noch leistungsfähiger und besser für statische Abfragen wie diese zu verwenden.

+0

Danke, ich wusste davon, aber ich benutzte 'CreateCriteria' für andere Abfragen (angepasst von jeder Tabelle). Wenn Sie über 'QueryOver' sprechen, gibt es Unterschiede bei der Performance zwischen beiden? –

0

Schließlich funktionierte das!

var crit = StatelessSession.CreateCriteria<PeopleProduct>() 
    .SetProjection(Projections.ProjectionList() 
      .Add(Projections.Count(Projections.Distinct(
        Projections.Property<PeopleProduct>(p => p.PeopleId))))); 

var count = Convert.ToInt64(crit.UniqueResult()); 

EDIT: Es gibt eine bessere Antwort (und weniger ausführlich) ...