2014-09-09 17 views
7

Abbiamo una stored procedure che restituisce diverse tabelle. Quando lo chiamiamo usando NHibernate, usiamo il trasformatore di bean, ma otteniamo solo la prima tabella trasformata e tutti gli altri risultati vengono ignorati.NHibernate query denominata e più set di risultati

So che NH è in grado di elaborare più query in un db trip usando i futures ma abbiamo solo una query e produce un risultato simile a quello che otterremmo con i future, ma ottenendo questo da una stored procedure.

Credo che questo scenario sia abbastanza comune ma non è riuscito a trovare alcun indizio. È possibile utilizzare l'NH per recuperare tali risultati?

+0

potrebbe forse dividere la SP in due? se è così, puoi farlo funzionare usando 'CreateSQLQuery' due volte –

+0

Sembra che la tua risposta sia [qui] (http://stackoverflow.com/questions/4623549/) –

+0

@Andrew Con i futures evitiamo più viaggi di andata e ritorno verso il database, non vedo alcun punto di dividere il SP per fare il contrario. –

risposta

4

Sì, è possibile utilizzare multiquery "Hack" come questo:

Il procudure:

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

Il NHibernate Codice Query:

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

scusate mio male, questo mi sembra un gran bel codice –

Problemi correlati