2014-09-09 1 views
7

У нас есть хранимая процедура, которая возвращает несколько таблиц. При вызове с помощью NHibernate мы используем трансформатор bean, но только преобразуем первую таблицу и все остальные результаты игнорируются.NHibernate с именем query и несколькими наборами результатов

Я знаю, что NH может обрабатывать несколько запросов в одной поездке с использованием фьючерсов, но у нас только один запрос, и он дает результат, похожий на то, что мы будем получать с фьючерсами, но получая это из хранимой процедуры.

Я считаю, что этот сценарий довольно распространен, но не нашел никаких подсказок. Можно ли использовать NH для получения таких результатов?

+0

Не могли бы вы, возможно, разделить СП на два? если это так, вы можете сделать эту работу, используя «CreateSQLQuery» дважды –

+0

Кажется, что ваш ответ [здесь] (http://stackoverflow.com/questions/4623549/) –

+0

@Andrew С фьючерсами мы избегаем многократных круговых поездок на базы данных, я не вижу смысла разбивать SP на противоположное. –

ответ

4

Да, вы можете использовать MultiQuery "Hack", как это:

The procudure:

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

NHibernate запроса Код:

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

Извините, мой плохой, это похоже на отличный код –

Смежные вопросы