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

时间:2011-05-26 14:37:30

标签: c# nhibernate nhibernate-projections

作为nHibernate及其实用程序库的新用户,流畅的nhibernate,我正在努力学习一个好的数据库是危险的。

我在理解预测的概念方面遇到了极大的困难。具体来说,他们是世界上的什么?

我确实搜索了'什么是投影?'和' nHibernate中的项目'和' nHibernate,Projections,Definition '等我还是很困惑。到目前为止,最有用的帖子是This other StackOverflow QuestionThis Blog Post by Colin Ramsay。但我仍然非常困惑。我对数据库的了解至多仍然是入门级的。

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

3 个答案:

答案 0 :(得分:71)

这是一个实际的例子。

假设您有一个在线商店,并且您的某个域类是Brand,例如“Samsung”。此类有一大堆与之关联的属性,可能是整数IdentityName,自由文本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的列表,而是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 ....)。

希望这有帮助。

答案 1 :(得分:2)

如果您熟悉SQL,则投影是查询的SELECT子句,用于选择要返回的可用结果中的哪些字段。

例如,假设您有Person FirstNameLastNameAddressPhone字段。如果您希望查询返回所有内容,则可以不进行投影,这类似于SQL中的SELECT * FROM Person。如果您只想要名字和姓氏,则可以使用FirstNameLastName创建一个投影 - 在SQL术语中为SELECT FirstName, LastName FROM Person

答案 2 :(得分:1)

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

“...仅检索一个或多个实体的属性,无需加载开销 实体本身在交易范围内。这有时称为报告 查询;它更准确地称为投影。“[NHibernate in Action]