Получить одно свойство объекта из базы данных
Я работаю над 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 });
});