问题描述
|
作为nHibernate及其实用程序库的新用户,流利的nhibernate,我正在尝试学习足够多的知识,以免拥有好的数据库会带来危险。
在理解投影的概念时,我异常困难。具体来说,它们到底是什么?
我确实对\'什么是投影?\'和\'nHibernate中的项目\'和\'nHibernate,投影,定义\'等进行了精确搜索。但我仍然很困惑。到目前为止,最有帮助的帖子是《这另一个StackOverflow问题》和Colin Ramsay的《此博客帖子》。但是我仍然很困惑。我对数据库的知识充其量仍是入门级的。
我不太了解什么是投影,为什么要使用它们,它们的作用如何,等等。我在博客中看到他正在使用它们来获取整数列表(我认为是主键),因此他可以在不同的查询中使用它们,但这在功能上以及其原因上都是模糊的。
解决方法
这是一个实际的例子。
假设您有一家在线商店,其中一个域名类别是\ 0,例如\“ Samsung \”。此类具有一系列与之相关的属性,例如整数
Identity
,a2ѭ,自由文本Description
字段,对Vendor
对象的引用等等。
现在,假设您要显示一个菜单,其中包含在线商店中提供的所有品牌的列表。如果您只做5英镑,那您的确会得到所有品牌的。但是,您还将从数据库中吸收所有长的Description
字段和对Vendor
的引用,并且不需要使用它来显示菜单。您只需要Name
和Identity
。从性能角度来看,从数据库中吸收所有这些额外的数据会使速度变慢,这是不必要的。
而是可以创建一个仅包含Identity
和Name
调用对象的\“ projection \”对象,例如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);
}
现在您没有ѭ0list的列表,而是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 ....
)。
希望这可以帮助。
,如果您熟悉SQL,则投影是查询的SELECT
子句,用于从可用结果中选择要返回的字段。
例如,假设您有一个带有FirstName
,LastName
,Address
和Phone
字段的Person
。如果要查询返回所有内容,则可以省略投影,就像SQL中的“ 26”一样。如果只需要名字和姓氏,则可以使用FirstName
和LastName
创建一个投影-在SQL术语中为SELECT FirstName,LastName FROM Person
。
,您可以使用投影来调用SUM,COUNT ...之类的sql函数,也可以选择单个字段而不返回实体。
\“ ...仅检索一个或多个实体的属性,而没有加载的开销
实体本身在交易范围内。有时称为报告
查询它更正确地称为投影。\“ [NHibernate in Action]