这是一个实际的例子。
假设您有一个在线商店,并且您的域类之一是Brand
“Samsung”。这个类有一大堆与之关联的属性,可能是 integer Identity
、 a 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);
}
现在你没有一个 s 的列表,Brand
而是一个 s 的列表NameIdentityPair
,NHibernate 将只发出一条 SQL 语句SELECT b.Identity, b.Name from dbo.Brand b
来获取这个投影,而不是一个获取水合对象所需的一切的大量 SQL 语句Brand
(例如,SELECT b.Identity, b.Name, b.Description from dbo.brand b left join dbo.vendor v ....
)。
希望这可以帮助。