2016-03-19 2 views
2

Quick Info über was ich zu erreichen versuche. Ich habe einige Protokolltabellen und füge die Daten in eine einzelne Zeile für jedes Protokollelement ein. Das Problem, das ich habe, versucht, ein STUFF (Abfrage, 1,1, '') in NHibernate zu replizieren. Ich habe alle meine Beziehungen einrichten und arbeiten und die Abfrage mit nur den Joins funktioniert gut, kann einfach nicht herausfinden, wie das STUFF mit einer Abfrage in es implementieren.STUFF SQL-Abfrage in NHibernate, im Grunde versucht, MySQLGroupConcat zu replizieren

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 was ich brauche ist (Spalten):

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

ich dies in Nhibernate ohne STUFF tun können, etwa so:

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/ zum Erstellen der STUFF-Funktion, aber ich glaube nicht, dass es erstellt wurde mit der Idee, es so zu benutzen, wie ich es möchte, und ich konnte es nicht erfolgreich zum Laufen bringen.

Also, meine Frage kann und wie kann ich STUFF so implementieren, wie ich will? Oder gibt es einen besseren Ansatz, um die gewünschten Informationen zu erhalten?

Datenbank Referenzbeispiel:

Geschichte Tabelle

ID - ReportID - Name - UserID 

SubHistory Tabelle - (kann viele sein)

ID - HistoryID - SubInfo 

Usertable

ID - FirstName - LastName 

Cust Tabelle

ID - CustInfo 

EmailHistory Tabelle - (kann nur eine hat)

ID - HistoryID - Email 
+0

Ist es wirklich 'den harten Teil stuff'? Diese Funktion hat nichts besonderes. Ich bin mir ziemlich sicher, dass der eigentliche Straßenblock die "for xml" Unterabfrage ist, die Sie darin aufrufen. Wie kann dies als Entitätsabfrage übersetzt werden? –

+0

Nun, wenn ich verstehe, was Sie sagen, das ist im Grunde meine Frage. Die Unterabfrage im "STUFF" bekommt, was ich brauche. die verketteten Spalten der Unterabfrage. Wie kann das in NHibernate repliziert werden?Also, ja, vielleicht ist STUFF nicht der schwierige Teil, sondern Teil dessen, was ich herausfinden will. –

Antwort

1

ich mit genug Bastelei vorstellen, können Sie schließlich bekommen es mit NHibernate Aufruf STUFF zu arbeiten, aber es könnte eine sehr lange Zeit in Anspruch nehmen. Es könnte eine schnellere/einfachere Lösung geben: Erstellen Sie eine Ansicht namens HistoryView, die im Wesentlichen die Abfrage, die Sie oben haben, durchführt. Erstellen Sie dann eine neue C# -Klasse, auch HistoryView genannt, mit Eigenschaften, die den Spalten Ihrer Ansicht entsprechen. Diese HistoryView Objekte werden nur gelesen, aber es wird das Ziel erreichen, das Sie suchen.

+0

Ähnlich könnte eine [benannte SQL-Abfrage] (http://nhibernate.info/doc/nhibernate-reference/querysql.html#querysql-namedqueries) die Aufgabe leicht erledigen. –

+0

Gehen Sie in beide Optionen zu sehen, danke! –

0

Also habe ich am Ende tatsächlich einen gespeicherten Prozedur-Aufruf dafür verwendet. Ich tat im Wesentlichen, was Aron mit einer View vorschlug, aber stattdessen als ein gespeichertes Proc, und erstellte ein neues Objekt, um die gespeicherten Prozeduren zurückzugeben.

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

Verwandte Themen