有人能更好地解释一下吗;投影';在nHibernate
本文关键字:一下 投影 nHibernate 更好 解释 | 更新日期: 2023-09-27 17:57:48
作为nHibernate及其实用程序库fluent nHibernate的新用户,我正在努力学习如何使用一个好的数据库来应对危险。
我在理解投影的概念时遇到了异常大的困难。具体来说,它们到底是什么
我确实在'上做了精确的搜索什么是投影'和'ProjectsinnHibernate'以及'nHibernate,Projections,Definition'等等。我仍然很困惑。到目前为止,最有用的帖子是Colin Ramsay的《另一个StackOverflow问题》和《这篇博客文章》。但我仍然非常困惑。我对数据库的了解充其量还是入门级的。
我真的不明白投影是什么,我为什么要使用它们,它们正在实现什么,等等。我在博客文章中看到,他正在使用它们来获得一个整数列表(我认为是主键),这样他就可以在不同的查询中使用它们,但这在其运行方式和原因方面有点模糊。
这里有一个实际的例子。
假设您有一个在线商店,其中一个域类是类似"Samsung"的Brand
。这个类有大量与之相关的属性,可能是一个整数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
s的列表,而是有NameIdentityPair
s的列表。NHibernate将只发布像SELECT b.Identity, b.Name from dbo.Brand b
这样的SQL语句来获得此投影,而不是获取对Brand
对象(例如SELECT b.Identity, b.Name, b.Description from dbo.brand b left join dbo.vendor v ....
)进行水合所需的所有内容的大型SQL语句。
希望这能有所帮助。
如果您熟悉SQL,则投影是查询的SELECT
子句,用于从可用结果中选择要返回的字段。
例如,假设您有一个包含FirstName
、LastName
、Address
和Phone
字段的Person
。如果希望查询返回所有内容,可以省略投影,这与SQL中的SELECT * FROM Person
类似。如果您只想要名字和姓氏,那么您可以创建一个具有FirstName
和LastName
的投影——在SQL术语中,这将是SELECT FirstName, LastName FROM Person
。
您可以使用投影来调用sql函数,如SUM、COUNT。。。或者选择单个字段而不返回实体。
"…只检索一个或多个实体的属性,而不需要加载开销事务作用域中的实体本身。这有时被称为报告查询它更准确地称为投影。"[Hibernate在行动]