2016-04-25 11 views
0

Ich mag diese SQL-Abfrage in Nhibernate QueryOver tun:Gruppe von mit verschiedener Auswahl Nhibernate

SELECT id FROM tb_example 
GROUP BY id, name 
ORDER BY name 

Was ich versuchte:

1) ich ein .Select in SelectList versuche hinzugefügt außer Kraft zu setzen die Auswahl von SelectGroup aber kein Erfolg

var query = session.QueryOver<Person>() 
        .SelectList(list => list 
        .Select(p => p.Id) 
        .SelectGroup(p => p.Id) 
        .SelectGroup(p => p.Name)); 
query = query.OrderBy(p => p.Name).Asc; 

generiert SQL mit query:

SELECT id, id, name FROM tb_example 
GROUP BY id, name 
ORDER BY name 

2) in den Ergebnissen einer anderen Abfrage verwenden Abfrage. Wie folgt:

SELECT id 
FROM 
    (SELECT id, name FROM tb_example 
    GROUP BY id, name 
    ORDER BY name) 

Aber ich weiß nicht, wie Sie eine Abfrage der Ergebnisse von einer anderen Abfrage erstellen.

var groupByQuery = session.QueryOver<Person>() 
         .SelectList(list => list 
         .SelectGroup(p => p.Id) 
         .SelectGroup(p => p.Name)); 
var query = session.QueryOver<?????>(); 

Wie kann ich das tun? Vielen Dank!

+0

# In Bezug auf 1, leider mit QueryOver Sie _must_ 'SELECT' alle der Gruppierungsspalten. # 2 ist absolut unmöglich, soweit ich weiß. QueryOver kann nur aus gemappten Tabellen auswählen (nicht willkürliche Tabellenausdrücke wie Ihr Beispiel zeigt). –

+1

Siehe auch diese Frage, möglicherweise ein Duplikat: http://Stackoverflow.com/q/30913037/497356 –

+0

Hallo @AndrewWhitaker, es ist eine Ehre. Ich habe alle Ihre NHibernate QueryOver Series verfolgt. Ich habe die Lösung in dieser Frage gefunden, ich schließe meine Frage als Duplikat ab. Danke vielmals! –

Antwort

0

Simplest Lösung, die ich weiß, ist:

var query = session 
    .QueryOver<Person>() 
    .SelectList(list => list 
    .SelectGroup(p => p.Id) 
    .SelectGroup(p => p.Name)); 
query = query.OrderBy(p => p.Name).Asc; 
query.List().Select(x => (int)x[0]).ToList(); 
+0

Hallo Stefan, danke für anwsering. Ich kann die Abfrage nicht ausführen und dann linq verwenden. Mit dem Ergebnis dieser Abfrage werde ich es in einer .In verwenden. Bei einer Liste oder einem Array wird die Begrenzung der 2100 Parameter mich stoppen. Deshalb suche ich nach einer NHibernate Lösung. –

+1

Ich hatte das gleiche Problem vor einer Weile. Kann mich nicht erinnern, wie ich es gelöst habe. Brauchen Sie es wieder zu finden. –

0

Können Sie versuchen unter Beispiel

var groupByQuery = (from p 
     in this.Session.Query<Person>() 
     group p by new { Id= p.Id, Name= p.Name} 
     into g 
     select p).ToList(); 
+0

Hallo Soner, danke für die Antwort. Ich bekomme einen Compiler-Fehler in Select p "Das Argument Typen kann nicht aus der Abfrage abgeleitet werden". Und ich habe nicht gefunden, wo Sie die Auswahl nur in p.Id tun, können Sie es ein wenig erklären? –

Verwandte Themen