作为 nHibernate 及其实用程序库 fluent nhibernate 的新用户,我正在尝试学习足够多的知识,以便使用一个好的数据库来应对危险。
我在理解投影 的概念时遇到了很大的困难。具体来说,它们到底是什么?
我确实对“什么是投影?”和“nHibernate 中的项目”和“nHibernate、投影、定义”进行了精确搜索'等。我仍然很困惑。到目前为止最有用的帖子是 This other StackOverflow Question和 This Blog Post by Colin Ramsay .但我仍然非常困惑。我对数据库的了解充其量只是入门级的。
我真的不明白投影是什么,为什么我要使用它们,它们正在完成什么,等等。我在博客文章中看到他正在使用它们来获取整数列表(我假设是主键)这样他就可以在不同的查询中使用它们,但这在它的运作方式和原因上有点模糊。
最佳答案
这是一个实际的例子。
假设您有一家在线商店,您的一个域类是 Brand
比如“三星”。这个类有一大堆与之相关的属性,可能是一个整数 Identity
, 一个 Name
, 自由文本 Description
字段,对 Vendor
的引用对象等。
现在假设您要显示一个菜单,其中包含在线商店提供的所有品牌的列表。如果你只是做 session.CreateCriteria<Brand>().List()
,那么你确实会得到所有的品牌。但是你也会吸走所有的长Description
字段和对 Vendor
的引用s 来自数据库,你不需要它来显示菜单;你只需要 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 语句。获得这个投影,而不是一个庞大的 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/