Получить одно свойство объекта из базы данных

Я работаю над NET MVC 3.0 и Nhibernate 3.0. Я хочу получить только одно свойство из базы данных в объект.

Например, предположим, у меня есть класс Module. Я хочу выбрать все имена из таблицы модулей (например, select modulename from module запрос) и подготовить список объектов модуля, которые имеют только имя. Все остальные свойства могут быть null,

Я попробовал это с помощью QueryOver API:

IQueryOver<ProjectModule> module = session.QueryOver<ProjectModule>()
    .Select(a=>a.Name)                   
    .TransformUsing(
        NHibernate.Transform.Transformers.AliasToBean<ProjectModule>());

pm = module.List<ProjectModule>();

pm является IList<ProjectModule> тип.

Транзакция совершается успешно. Ошибка не возникла, но я получаю список объектов модуля со всеми свойствами = null, Название модуля null, идентификатор модуля null и т.п.

Я проверил, какой запрос выполняется на SQL с помощью NUnit, и получил это: SELECT this_Name as y0_ FROM ProjectModule this_,

3 ответа

Решение

Чтобы быть более точным, создайте объект DTO, предположим ProjectModuleDto, который будет содержать только имя. Не рекомендуется использовать объект домена с неинициализированными значениями в вашем коде, потому что это создает путаницу в заполненных данных в различных сценариях.

И изменяющийся код сделает свое дело - заполните список DTO: ProjectModuleDto с правильным именем модуля проекта из базы данных:

ProjectModuleDto projectModuleDto = null;           
IQueryOver<ProjectModule> module = session.QueryOver<ProjectModule>()
    .SelectList(
        list=>list.Select(a => a.Name).WithAlias(() => projectModuleDto.Name)
    )                 
    TransformUsing(NHibernate.Transform.Transformers.AliasToBean<ProjectModuleDto>());

pm = module.List<ProjectModuleDto>();           

Если вы выбираете только одно свойство, вам не нужно использовать преобразователи. Попробуйте использовать List<string> непосредственно:

var moduleNames = session.QueryOver<ProjectModule>()
    .Select(a => a.Name)                   
    .List<string>();

Узнайте больше о синтаксисе QueryOver в блоге NHibernate.

Это то, что вы ищете?

  List<ProjectModule> result = new List<ProjectModule>();

  session.QueryOver<ProjectModule>()
  .Select(a => a.Name)                   
  .ToList().ForEach(delegate(string mName)
  {
       result.Add(ProjectModule() { Name = mName });
  });
Другие вопросы по тегам