Свободный NHibernate HQL Назначение нескольких типов классов для запроса выбора нескольких таблиц - PullRequest
1 голос
/ 06 апреля 2011

Я знаю, как назначить тип класса для данных, извлекаемых из одной таблицы, например:

HQL-запрос:

select s from Employee e join e.Store s where s.Id = 1

Код:

var stores = session.CreateQuery(hql).List<Store>();

foreach (var store in stores)
{
    Console.WriteLine(store.Name);

    foreach (var product in store.Products)
    {
        Console.WriteLine("    " + product.Name);
    }
}

НоКак мы можем назначить несколько типов классов для запроса объединения нескольких таблиц?В настоящее время я не могу указать какой-либо тип класса, поскольку данные поступают из нескольких таблиц.

HQL-запрос:

select distinct s.Name,p.Name,p.Price,p.Location.Aisle,p.Location.Shelf from Store s join s.Products p where s.Id = 1

Код:

var rows = session.CreateQuery(hql).List(); // Using List() instead of List<T>()

for (int i = 0; i < rows.Count; i++)
{
    IList cols = (IList)rows[i];

    for (int j = 0; j < cols.Count; j++)
    {
        Console.Write(cols[j] + " ");
    }

    Console.WriteLine("");
}

1 Ответ

1 голос
/ 06 апреля 2011

Вам необходимо указать трансформатор. Одним из вариантов является указание преобразователя EntityMap.

session.CreateQuery.SetTransformer(Transformers.AliasToEntityMap)

Это вернет список словарей, которые будут содержать пары имя-значение на основе вашего запроса. Кроме того, вы можете создать объект POCO, который сопоставляется с вашим запросом

public class MyProjection
{
   public string SName { get; set; }
   public string PName { get; set; }
   public float Price { get; set; }
   public string Aisle { get; set; }
   public string Shelf { get; set; }
}

Затем укажите другой трансформатор

session.CreateQuery.SetTransformer(Transformers.AliasToBean<MyProjection>())
      .List<MyProjection>();

Имейте в виду, что вам нужно указать псевдонимы для обоих подходов

select distinct s.Name as SName,p.Name as PName,p.Price as Price,
     p.Location.Aisle as Aisle, p.Location.Shelf as Shelf...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...