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

Der*_*rek 30 c# nhibernate nhibernate-projections

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

我对于预测的概念有着极大的困难.具体来说,他们是世界上的什么?

我确实在' 什么是预测?'和' nHibernate中项目 '和' nHibernate,Projections,Definition '等等.我仍然很困惑.到目前为止最有用的帖子是其他StackOverflow问题Colin Ramsay撰写的此博客文章.但我仍然非常困惑.我对数据库的了解至多仍然是入门级的.

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

Nic*_*cki 74

这是一个实际的例子.

假设你有一个在线商店,你的一个域类Brand就像"三星".这个类有一大堆与之关联的属性,可能是整数Identity,a Name,自由文本Description字段,Vendor对象的引用等等.

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

相反,您可以创建一个"投影"对象,其中只包含IdentityName调用它,比如说NameIdentityPair:

public class NameIdentityPair
{
    public int Identity { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

而且你可以告诉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);
}
Run Code Online (Sandbox Code Playgroud)

现在你没有Brands 的列表,而是s的列表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 ....).

希望这可以帮助.

  • 许多应用程序读取的次数比写入时更频繁,因此常见的模式是在从数据库读取时使用投影,并使用完全水合的域对象来保存到数据库.通过这种方式,可以调整数据库中的读取以提高性能,并且可以调整对数据库的写入以利用业务逻辑(在您的域类中编写)和您正在使用的工具(NHibernate从大多数CRUD代码中拯救您) )."投影"有点像挑出你需要的数据,以便NHibernate在生成SQL时只向数据库询问数据. (5认同)
  • 因此,投影就像查询端限制器,查询结果限制器的内容.在正常情况下,我会创建`NameIdentityPair`对象并从查询中将我的结果映射到它,但是使用Projection,我在查询中指定了我要求的精确过滤,这是所有数据库都知道的吗? (2认同)