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

Nhibernate 从数据库中获取对象中的单个属性,nhibernate,queryover,Nhibernate,Queryover,我正在开发NETMVC3.0和NHibernate3.0。我只想从数据库中提取一个属性到一个对象 ProjectModuleDto projectModuleDto = null; IQueryOver<ProjectModule> module = session.QueryOver<ProjectModule>() .SelectList( list=>list.Select(a => a.Name).With

我正在开发NETMVC3.0和NHibernate3.0。我只想从数据库中提取一个属性到一个对象

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>();           
例如,假设我有一个类模块。我想从模块表中选择所有名称(如
从模块中选择modulename
查询),并准备一个只有名称的模块对象列表。所有其他属性都可以
null

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>();           
我使用QueryOver API尝试了这一点:

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

pm = module.List<ProjectModule>();
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>();           
IQueryOver模块=session.QueryOver()
.选择(a=>a.Name)
.转换使用(
NHibernate.Transform.Transformers.AliasToBean());
pm=module.List();
pm
IList
类型

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>();           
事务成功提交。没有发生错误,但我得到了一个所有属性均为null的模块对象列表。模块名称
null
,模块id
null

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>();           

我使用NUnit检查了SQL上正在执行的查询,并得到以下信息:
选择此名称为y0。\n从ProjectModule this_u

如果只获取单个属性,则不需要使用转换器。尝试直接使用
列表

var moduleNames = session.QueryOver<ProjectModule>()
    .Select(a => a.Name)                   
    .List<string>();
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>();           
var moduleNames=session.QueryOver()
.选择(a=>a.Name)
.List();

阅读有关上的QueryOver语法的详细信息。

要更准确地创建DTO对象,请假设ProjectModuleTo只包含名称。通过代码使用未初始化值的域对象不是一个好的做法,因为它会在各种场景中造成填充数据的混乱

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>();           
FLOWING代码将实现这一技巧-使用数据库中项目模块的正确名称填充DTO:ProjectModuleTo列表:

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>();           
ProjectModuleDto ProjectModuleDto=null;
IQueryOver模块=session.QueryOver()
.选择列表(
list=>list.Select(a=>a.Name).WithAlias(()=>projectModuleDto.Name)
)                 
TransformUsing(NHibernate.Transform.Transformers.AliasToBean());
pm=module.List();

这就是你要找的吗

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<ProjectModule> result = new List<ProjectModule>();

  session.QueryOver<ProjectModule>()
  .Select(a => a.Name)                   
  .ToList().ForEach(delegate(string mName)
  {
       result.Add(ProjectModule() { Name = mName });
  });
列表结果=新列表();
session.QueryOver()
.选择(a=>a.Name)
.ToList().ForEach(委托(字符串mName)
{
Add(ProjectModule(){Name=mName});
});

我不希望结果出现在字符串列表中。我希望出现在IList中。从字符串列表初始化项目模块列表相当容易,虽然我更愿意接受diadiora的建议,并为此创建一个单独的DTO。感谢您的回复,这也是正确的解决方案,但由于我需要ProjectModule对象的结果,所以我同意diadiora的回答。非常感谢。这很有效:)谢谢。但是作为一名学生,你能告诉我一些想法吗?1.为什么我们必须使用SelectList(list=>list…)为什么不直接选择(a=>a.Name)?正如我试图做的2。为什么我们在WithAlias中使用“()”,这是什么意思?如果您只想使用(a=>a.Name),则必须使用Miroslav Popovic提供的答案,但在本例中,您将获得字符串列表,而不是类型对象列表,其中可能还包含多个属性。假设您的ProjectModuleDto有名称和颜色,而您只需编写。SelectList(list=>list.Select(a=>a.Name)。WithAlias(()=>ProjectModuleDto.Name)。Select(a=>a.Color)。WithAlias(()=>ProjectModuleDto.Color))就完成了。这对我来说很清楚了。2号怎么样。为什么我们在Alias中使用“()”,这是什么意思?嘿,你看到diadiora的解决方案了吗?哪一个更好?