作为nHibernate及其实用程序库的新用户,流畅的nhibernate,我正在努力学习一个好的数据库是危险的。
我在理解预测的概念方面遇到了极大的困难。具体来说,他们是世界上的什么?
我确实搜索了'什么是投影?'和' nHibernate中的项目'和' nHibernate,Projections,Definition '等我还是很困惑。到目前为止,最有用的帖子是This other StackOverflow Question和This Blog Post by Colin Ramsay。但我仍然非常困惑。我对数据库的了解至多仍然是入门级的。
我真的不明白什么是预测,我为什么要使用它们,它们正在完成什么等等。我在博客文章中看到他正在使用它们来获取整数列表(我假设主键)这样他就可以在不同的查询中使用它们,但这在它运作的方式和原因上有点模糊。
答案 0 :(得分:71)
这是一个实际的例子。
假设您有一个在线商店,并且您的某个域类是Brand
,例如“Samsung”。此类有一大堆与之关联的属性,可能是整数Identity
,Name
,自由文本Description
字段,对Vendor
对象的引用,以及等等。
现在假设您要显示一个菜单,其中列出了您在线商店提供的所有品牌。如果您只是session.CreateCriteria<Brand>().List()
,那么您确实会获得所有品牌。但是你也会从数据库中吸取所有长Description
个字段和对Vendor
的引用,你不需要显示菜单;您只需要Name
和Identity
。在性能方面,从数据库中删除所有这些额外数据会减慢速度并且不必要。
相反,您可以创建一个“投影”对象,其中只包含Identity
和Name
,只需NameIdentityPair
:
public class NameIdentityPair
{
public int Identity { get; set; }
public string Name { get; set; }
}
你可以告诉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);
}
现在你没有Brand
的列表,而是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 ....
)。
希望这有帮助。
答案 1 :(得分:2)
如果您熟悉SQL,则投影是查询的SELECT
子句,用于选择要返回的可用结果中的哪些字段。
例如,假设您有Person
FirstName
,LastName
,Address
和Phone
字段。如果您希望查询返回所有内容,则可以不进行投影,这类似于SQL中的SELECT * FROM Person
。如果您只想要名字和姓氏,则可以使用FirstName
和LastName
创建一个投影 - 在SQL术语中为SELECT FirstName, LastName FROM Person
。
答案 2 :(得分:1)
您可以使用投影来调用SUM函数,COUNT ......或者选择单个字段而不返回实体。
“...仅检索一个或多个实体的属性,无需加载开销 实体本身在交易范围内。这有时称为报告 查询;它更准确地称为投影。“[NHibernate in Action]