2014-09-09 15 views
7

Mamy procedura składowana, która zwraca kilka tabel. Podczas wywoływania go za pomocą NHibernate używamy transformatora bean, ale tylko pierwsza transformowana tabela i wszystkie inne wyniki są ignorowane.Zapytania nazwane NHibernate i zestawy wielu wyników

Wiem, że NH jest w stanie przetworzyć kilka zapytań w jednym wydaniu bazy danych przy użyciu kontraktów futures, ale mamy tylko jedno zapytanie i daje wynik podobny do tego, jaki uzyskalibyśmy w przypadku kontraktów terminowych, ale uzyskaliśmy to z procedury składowanej.

Uważam, że ten scenariusz jest dość powszechny, ale nie mógł znaleźć żadnych wskazówek. Czy można użyć NH, aby uzyskać takie wyniki?

+0

można ewentualnie podzielić SP na dwie części? Jeśli tak, możesz to zrobić, używając 'CreateSQLQuery' dwa razy –

+0

Wygląda na to, że twoją odpowiedzią jest [tutaj] (http://stackoverflow.com/questions/4623549/) –

+0

@Andrew Z kontraktami futures unikamy wielokrotnych podróży w obie strony do bazy danych, nie widzę sensu dzielenia SP, aby zrobić coś odwrotnego. –

Odpowiedz

4

Tak, można użyć MultiQuery "hack" tak:

The procudure:

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

NHibernate Kod zapytania:

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

Przepraszam, moje złe, to wygląda na świetny kod –

Powiązane problemy