gpt4 book ai didi

c# - 有人能更好地解释 nHibernate 中的 'Projections' 是什么吗?

转载 作者:IT王子 更新时间:2023-10-29 04:10:26 25 4
gpt4 key购买 nike

作为 nHibernate 及其实用程序库 fluent nhibernate 的新用户,我正在尝试学习足够多的知识,以便使用一个好的数据库来应对危险。

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

我确实对“什么是投影?”和“nHibernate 中的项目”和“nHibernate、投影、定义”进行了精确搜索'等。我仍然很困惑。到目前为止最有用的帖子是 This other StackOverflow QuestionThis Blog Post by Colin Ramsay .但我仍然非常困惑。我对数据库的了解充其量只是入门级的。

我真的不明白投影是什么,为什么我要使用它们,它们正在完成什么,等等。我在博客文章中看到他正在使用它们来获取整数列表(我假设是主键)这样他就可以在不同的查询中使用它们,但这在它的运作方式和原因上有点模糊。

最佳答案

这是一个实际的例子。

假设您有一家在线商店,您的一个域类是 Brand比如“三星”。这个类有一大堆与之相关的属性,可能是一个整数 Identity , 一个 Name , 自由文本 Description字段,对 Vendor 的引用对象等。

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

相反,您可以创建一个仅包含 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 语句。获得这个投影,而不是一个庞大的 SQL 语句,它捕获所有必要的东西来滋润 Brand对象(例如 SELECT b.Identity, b.Name, b.Description from dbo.brand b left join dbo.vendor v .... )。

希望这对您有所帮助。

关于c# - 有人能更好地解释 nHibernate 中的 'Projections' 是什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6140379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com