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

标签 c# nhibernate nhibernate-projections

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

相关文章:

c# - python默认字典在c#中等效

nhibernate - QueryOver - 如何从三个表的联接中仅选择一个对象

hibernate - 何时使用 Hibernate 投影?

c# - 系统.Data.SqlTypes.SqlTypeException : SqlDateTime overflow

c# - 一种反转整数变量的二进制值的方法

c# - 在不使用 Where() 的情况下使用 GroupBy() 和 Timeout() 时出现 NotSupportedException

c# - 流利的 nHibernate 加入

sql - Nhibernate count distinct(基于多列)

NHibernate 投影、AutoMapping、IPagedList,怎么做?

c# - 在另一个 aspx.cs 类中引用一个 aspx.cs 类?