Der*_*rek 30 c# nhibernate nhibernate-projections
作为nHibernate及其实用程序库的新用户,流畅的nhibernate,我正在努力学习一个好的数据库是危险的.
我对于预测的概念有着极大的困难.具体来说,他们是世界上的什么?
我确实在' 什么是预测?'和' nHibernate中的项目 '和' nHibernate,Projections,Definition '等等.我仍然很困惑.到目前为止最有用的帖子是其他StackOverflow问题和Colin Ramsay撰写的此博客文章.但我仍然非常困惑.我对数据库的了解至多仍然是入门级的.
我真的不明白什么是预测,我为什么要使用它们,它们正在完成什么,等等.我在博客文章中看到他正在使用它们来获取整数列表(我假设主键)这样他可以在不同的查询中使用它们,但这在它运行的方式和原因上有点模糊.
Nic*_*cki 74
这是一个实际的例子.
假设你有一个在线商店,你的一个域类Brand
就像"三星".这个类有一大堆与之关联的属性,可能是整数Identity
,a Name
,自由文本Description
字段,Vendor
对象的引用等等.
现在假设您要显示一个菜单,其中列出了您在线商店提供的所有品牌.如果你这样做session.CreateCriteria<Brand>().List()
,那么你确实会得到所有的品牌.但是你也会从数据库中吸取所有长Description
字段和Vendor
s的引用,而你不需要显示菜单; 你只需要Name
和Identity
.在性能方面,从数据库中吸取所有这些额外数据会减慢速度并且不必要.
相反,您可以创建一个"投影"对象,其中只包含Identity
和Name
调用它,比如说NameIdentityPair
:
public class NameIdentityPair
{
public int Identity { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
而且你可以告诉NHibernate只选择你真正需要执行任务的数据,告诉它将结果集转换为你的投影:
var brandProjections = this.session.CreateCriteria<Brand>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Name"), "Name")
.Add(Projections.Property("Identity"), "Identity"))
.SetResultTransformer(Transformers.AliasToBean<NameIdentityPair>())
.List<NameIdentityPair>();
foreach (var brandProjection in brandProjections)
{
Console.WriteLine(
"Identity: {0}, Name: {1}",
brandProjection.Identity,
brandProjection.Name);
}
Run Code Online (Sandbox Code Playgroud)
现在你没有Brand
s 的列表,而是s的列表NameIdentityPair
,NHibernate只会发出一个类似于SELECT b.Identity, b.Name from dbo.Brand b
获取此投影的SQL语句,而不是一个大规模的SQL语句,它可以获取水化Brand
对象所需的一切(例如,SELECT b.Identity, b.Name, b.Description from dbo.brand b left join dbo.vendor v ....
).
希望这可以帮助.
归档时间: |
|
查看次数: |
14283 次 |
最近记录: |