1

我正在研究 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、模块 IDnull等。

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

4

3 回答 3

1

如果您只获取一个属性,则不需要使用转换器。尝试List<string>直接使用:

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

在NHibernate 博客上阅读有关 QueryOver 语法的更多信息。

于 2012-10-04T09:23:32.450 回答
1

为了更准确地创建 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>();           
于 2012-10-04T11:19:45.073 回答
0

这是你要找的吗?

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

  session.QueryOver<ProjectModule>()
  .Select(a => a.Name)                   
  .ToList().ForEach(delegate(string mName)
  {
       result.Add(ProjectModule() { Name = mName });
  });
于 2012-10-04T23:24:56.970 回答