Как показать результат nHibernate CreateSQLQuery в DataGridView? - PullRequest
0 голосов
/ 22 февраля 2019

Я получил результат запроса в nHibernate:

var result = _Session.CreateSQLQuery("SELECT 'just a string' as Type, NAME  FROM SCHEMA.PERSON where NAME like ('%A%')").List();

, и я хочу показать этот результат в DataGridView.Итак, я попытался:

this.results.DataSource = result;

Но это не работает (показывает только много таких вещей, как «Длина», «Длинная длина», «Ранг» и так далее, но не фактический результат sql)как результат имеет тип: System.Collections.IList System.Collections.Generic.List и фактически выглядит как массив объектов внутри массива объектов.

Итак, я попытался:

this.results.DataSource = from res in result.Cast<List<object[]>>()
                          select new
                          {
                              T = res[0][0],
                              V = res[0][1]
                          };

но это только показывает пустой элемент управления.

Итак, как показать результаты и как сложную задачу, как показать псевдонимы / выбрать имена результатов в виде заголовков столбцов?

Кстати.Это должно работать для каждого SQL.Поэтому я не могу использовать mappingFiles.

1 Ответ

0 голосов
/ 01 марта 2019

После долгих поисков и помощи по этому вопросу: Выходные столбцы NHibernate / проекции CreateQuery (). List ()

Я нашел решение, которое работает для меня:

var query = _Session.CreateSQLQuery("SELECT 'just a string' as Type, NAME  FROM SCHEMA.PERSON where NAME like ('%A%')").SetResultTransformer(Transformers.AliasToEntityMap);
var result = query.List();

var tab = new DataTable();
if (result.Count > 0)
{
    var asHash = result[0] as Hashtable;
    foreach (DictionaryEntry item in asHash)
    {
        tab.Columns.Add(item.Key as string);
    }

    foreach (Hashtable item in result)
    {
        var newobj = new Object[tab.Columns.Count];
        int i = 0;
        foreach (DictionaryEntry row in item)
        {
            newobj[i]= row.Value;
            i++;
        }
        tab.Rows.Add(newobj);
    }
}

this.results.DataSource = tab; 

Я уверен, что есть другие (лучшие) способы сделать это, но эй: Это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...