Nhibernate 从数据库中获取对象中的单个属性
我正在开发NETMVC3.0和NHibernate3.0。我只想从数据库中提取一个属性到一个对象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
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
,模块idnull
等
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的解决方案了吗?哪一个更好?