我正在研究.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
,模块ID null
等。
我使用NUnit检查了在SQL上执行的查询,并得到了这个:SELECT this_Name as y0_ FROM ProjectModule this_
。
答案 0 :(得分:1)
如果您只提取一个属性,则不需要使用变换器。尝试直接使用List<string>
:
var moduleNames = session.QueryOver<ProjectModule>()
.Select(a => a.Name)
.List<string>();
详细了解NHibernate blog上的QueryOver语法。
答案 1 :(得分:1)
为了更准确地创建DTO对象,假设ProjectModuleDto只包含Name。在代码中使用带有未初始化值的域对象并不是一个好习惯,因为它会在各种各样的情况下产生填充数据的混淆。
fllowing代码将完成这一操作 - 填充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>();
答案 2 :(得分:0)
这是你要找的吗?
List<ProjectModule> result = new List<ProjectModule>();
session.QueryOver<ProjectModule>()
.Select(a => a.Name)
.ToList().ForEach(delegate(string mName)
{
result.Add(ProjectModule() { Name = mName });
});