STUFF SQL Query in NHibernate, im Grunde versuchen, MySQLGroupConcat zu replizieren

Schnelle Info über das, was ich versuche zu erreichen. Ich habe einige Geschichte Tabellen und bin Beitritt der data in eine einzelne Zeile für jede Geschichte Element. Das Problem, das ich habe, versucht, einen STUFF (Abfrage, 1,1, '') in NHibernate zu replizieren. Ich habe alle meine Beziehungen Setup und Arbeit und die Abfrage mit nur die Joins funktioniert gut, nur cant herauszufinden, wie die Umsetzung der STUFF mit einer Abfrage in sie.

Dies ist die gesamte Abfrage:

SELECT h.*, u.FirstName, u.LastName, eh.*, STUFF(( SELECT CONCAT(c.Name, ' - ') FROM SubHistory sh LEFT JOIN Cust c ON c.CustID = sh.SubCustId WHERE h.Id = sh.HistoryId FOR XML PATH ('')), 1, 1, '' ) AS Subs FROM History h LEFT JOIN EmailHistory eh ON eh.HistoryId = h.Id LEFT JOIN Usr u ON u.UsrID = h.UserId 

Das Ergebnis, das ich brauche, ist (Spalten):

 H.ID - H.ReportID - H.UserID - (Concatenated Subs) - u.FirstName - u.LastName - eh.Email 

Ich kann das ohne den STUFF in Nhibernate so machen:

 IList<History> hist = session.QueryOver<History>(() => historyAlias) .Left.JoinAlias(() => historyAlias.User, () => usrAlias) .Left.JoinAlias(() => historyAlias.Email, () => emailAlias) .List(); 

Ich folgte dem Tutorial hier http://blog.andrewawhitaker.com/blog/2014/08/15/queryover-series-part-7-using-sql-functions/ für die Erstellung der STUFF-function, aber ich glaube nicht, dass es war erstellt mit der Idee, es so zu benutzen, wie ich es will und ich konnte es nicht erfolgreich machen.

Also, meine Frage kann und wie kann ich STUFF so umsetzen wie ich will? Oder gibt es einen besseren Ansatz, um die Info, die ich will?

database Beispiel für reference:

Geschichte Tabelle

 ID - ReportID - Name - UserID 

Untergeschichte Tabelle – (kann viele sein)

 ID - HistoryID - SubInfo 

UserTable

 ID - FirstName - LastName 

Cust Tisch

 ID - CustInfo 

EmailHistory Tabelle – (kann nur eine haben)

 ID - HistoryID - Email 

Solutions Collecting From Web of "STUFF SQL Query in NHibernate, im Grunde versuchen, MySQLGroupConcat zu replizieren"

Ich stelle mir vor, mit dem Basteln, man kann es schließlich mit NHibernate anrufen, das STUFF anruft, aber es kann sehr lange dauern. Es könnte eine schnellere / einfachere Lösung geben: Erstellen Sie eine view namens HistoryView , die im Wesentlichen die Abfrage, die Sie an der Spitze haben. Dann erstellen Sie eine neue C # -class namens HistoryView , die properties hat, die den Spalten Ihrer view entsprechen. Diese HistoryView objecte werden readonly sein, aber es wird das Ziel erreichen, das du nachher hast.

Also habe ich am Ende tatsächlich eine gespeicherte Prozedur aufgerufen. Ich habe im Wesentlichen getan, was Aron mit einer view vorgeschlagen hat, aber als gespeicherte proc stattdessen und erstellt ein neues object, um die gespeicherte Prozedur zurückgegeben Zeilen.

Wie man ein SP in NHibernate anruft: http://nhibernate.info/doc/nhibernate-reference/querysql.html#sp_query