2014-09-09 6 views
7

Wir haben eine gespeicherte Prozedur, die mehrere Tabellen zurückgibt. Wenn wir es mit NHibernate aufrufen, verwenden wir den Bean-Transformer, transformieren aber nur die erste Tabelle und alle anderen Ergebnisse werden ignoriert.NHibernate benannte Abfrage und mehrere Ergebnismengen

Ich weiß, dass NH in der Lage ist, mehrere Abfragen in einer Db-Fahrt mit Futures zu verarbeiten, aber wir haben nur eine Abfrage und es erzeugt ein Ergebnis, das ähnlich ist, was wir mit Futures erhalten würden, aber dies aus einer gespeicherten Prozedur.

Ich glaube, dieses Szenario ist ziemlich verbreitet, konnte aber keine Hinweise finden. Ist es möglich, NH zu verwenden, um solche Ergebnisse zu erhalten?

+0

Könnten Sie spalten möglicherweise die SP in zwei? Wenn ja, könnten Sie dies tun, indem Sie 'CreateSQLQuery' zweimal verwenden –

+0

Es scheint, dass Ihre Antwort [hier] ist (http://Stackoverflow.com/questions/4623549/) –

+0

@Andrew Mit Futures vermeiden wir mehrere Rundreisen zum Datenbank, sehe ich keinen Sinn, den SP zu teilen, um das Gegenteil zu tun. –

Antwort

4

Ja, können Sie MultiQuery "Hack" wie folgt verwenden:

Die procudure:

CREATE PROCEDURE [dbo].[proc_Name] 
AS BEGIN 
    SELECT * FROM Question 
    SELECT * FROM Question 
END 

Die NHibernate Query-Code:

public void ProcdureMultiTableQuery() 
{ 
    var session = Session; 
    var procSQLQuery = session.CreateSQLQuery("exec [proc_Name] ?,?");// prcodure returns two table 
    procSQLQuery.SetParameter(0, userId); 
    procSQLQuery.SetParameter(1, page); 
    procSQLQuery.AddEntity(typeof(Question)); 

    var multiResults = session.CreateMultiQuery() 
     .Add(procSQLQuery) 
     // More table your procedure returns,more empty SQL query you should add 
     .Add(session.CreateSQLQuery(" ").AddEntity(typeof(Question))) // the second table returns Question Model 
     .List(); 
    if (multiResults == null || multiResults.Count == 0) 
    { 
     return; 
    } 
    if (multiResults.Count != 2) 
    { 
     return; 
    } 
    var questions1 = ConvertObjectsToArray<Question>((System.Collections.IList)multiResults[0]); 
    var questions2 = ConvertObjectsToArray<Question>((System.Collections.IList)multiResults[1]); 
} 

static T[] ConvertObjectsToArray<T>(System.Collections.IList objects) 
{ 
    if (objects == null || objects.Count == 0) 
    { 
     return null; 
    } 
    var array = new T[objects.Count]; 
    for (int i = 0; i < array.Length; i++) 
    { 
     array[i] = (T)objects[i]; 
    } 
    return array; 
} 
+0

Entschuldigung, mein Fehler, das scheint ein großartiger Code zu sein –