从数据库中获取对象中的单个属性

时间:2012-10-04 04:55:58

标签: nhibernate queryover

我正在研究.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>();

pmIList<ProjectModule>类型。

交易成功提交。没有发生错误,但我得到了一个包含所有属性= null的模块对象列表。模块名称null,模块ID null等。

我使用NUnit检查了在SQL上执行的查询,并得到了这个:SELECT this_Name as y0_ FROM ProjectModule this_

3 个答案:

答案 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 });
  });