Ответ 1
Вот практический пример.
Скажем, что у вас есть интернет-магазин, а один из ваших доменных классов - это Brand
как "Samsung". Этот класс имеет лодку связанных с ним свойств, возможно, целое число Identity
, a Name
, поле свободного текста Description
, ссылку на объект Vendor
и т.д.
Теперь скажем, что вы хотите отобразить меню со списком всех брендов, предлагаемых в вашем интернет-магазине. Если вы просто сделаете session.CreateCriteria<Brand>().List()
, тогда вы действительно получите все бренды. Но вы также сосали все длинные поля Description
и ссылки на Vendor
из базы данных, и вам не нужно отображать меню; вам просто нужны 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
, но вместо этого список NameIdentityPair
s и 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 ....
).
Надеюсь, что это поможет.