有人可以更好地解释nHibernate中的“投影”吗?

问题描述

| 作为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]