有人能更好地解释一下吗;投影';在nHibernate

本文关键字:一下 投影 nHibernate 更好 解释 | 更新日期: 2023-09-27 17:57:48

作为nHibernate及其实用程序库fluent nHibernate的新用户,我正在努力学习如何使用一个好的数据库来应对危险。

我在理解投影的概念时遇到了异常大的困难。具体来说,它们到底是什么

我确实在'上做了精确的搜索什么是投影'和'ProjectsinnHibernate'以及'nHibernate,Projections,Definition'等等。我仍然很困惑。到目前为止,最有用的帖子是Colin Ramsay的《另一个StackOverflow问题》和《这篇博客文章》。但我仍然非常困惑。我对数据库的了解充其量还是入门级的。

我真的不明白投影是什么,我为什么要使用它们,它们正在实现什么,等等。我在博客文章中看到,他正在使用它们来获得一个整数列表(我认为是主键),这样他就可以在不同的查询中使用它们,但这在其运行方式和原因方面有点模糊。

有人能更好地解释一下吗;投影';在nHibernate

这里有一个实际的例子。

假设您有一个在线商店,其中一个域类是类似"Samsung"的Brand。这个类有大量与之相关的属性,可能是一个整数Identity、一个Name、一个自由文本Description字段、一个对Vendor对象的引用,等等

现在假设您想要显示一个菜单,其中包含在线商店中提供的所有品牌的列表。如果你只做session.CreateCriteria<Brand>().List(),那么你确实会得到所有的品牌。但是,您还将从数据库中吸取所有长的Description字段和对Vendor的引用,并且不需要它们来显示菜单;您只需要NameIdentity。从性能角度来看,从数据库中吸取所有这些额外的数据会减慢速度,而且是不必要的。

相反,您可以创建一个只包含IdentityName的"投影"对象,称之为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子句,用于从可用结果中选择要返回的字段。

例如,假设您有一个包含FirstNameLastNameAddressPhone字段的Person。如果希望查询返回所有内容,可以省略投影,这与SQL中的SELECT * FROM Person类似。如果您只想要名字和姓氏,那么您可以创建一个具有FirstNameLastName的投影——在SQL术语中,这将是SELECT FirstName, LastName FROM Person

您可以使用投影来调用sql函数,如SUM、COUNT。。。或者选择单个字段而不返回实体。

"…只检索一个或多个实体的属性,而不需要加载开销事务作用域中的实体本身。这有时被称为报告查询它更准确地称为投影。"[Hibernate在行动]