Подтвердить что ты не робот

Может ли кто-нибудь лучше объяснить, что "Прогнозы" находятся в nHibernate?

Как новый пользователь nHibernate и его библиотека утилиты, свободно владеющая, я пытаюсь учиться достаточно, чтобы быть опасным с хорошей базой данных.

У меня возникает чрезвычайно сложное понимание концепции Проекции. В частности, что в мире это?

Я буквально выполнил точные поиски в разделе "Что такое прогнозы?" и "Проекты в nHibernate" и "nHibernate, Projections, Definition" и т.д. И я все еще очень смущен. Наиболее полезными сообщениями пока являются qaru.site/info/192031/... и Это сообщение в блоге от Colin Ramsay. Но я все еще очень смущен. Мои знания о базах данных в лучшем случае все еще находятся на начальном уровне.

Я действительно не понимаю, что такое прогнозы, почему я хотел бы использовать их, что они выполняют и т.д. В блоге я вижу, что он использует их для получения списка целых чисел (я предполагаю, что первичные ключи) так что он может использовать их в другом запросе, но это своего рода туманность в том, как он функционирует и почему.

4b9b3361

Ответ 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 ....).

Надеюсь, что это поможет.

Ответ 2

Если вы знакомы с SQL, проекция - это предложение SELECT запроса, используемое для выбора полей из доступных результатов для возврата.

Например, предположим, что у вас есть поля Person с полями FirstName, LastName, Address и Phone. Если вы хотите, чтобы запрос возвращал все, вы можете опустить проекцию, которая похожа на SELECT * FROM Person в SQL. Если вам просто нужны имя и фамилия, вы создадите проекцию с FirstName и LastName - которая будет SELECT FirstName, LastName FROM Person в терминах SQL.

Ответ 3

Вы можете использовать прогнозы для вызова SQL-функций, таких как SUM, COUNT... или выбрать отдельные поля без возврата объекта.

"... Получение только свойств объекта или объектов без накладных расходов сам объект в области транзакций. Это иногда называют докладом запрос; его более правильно называют проекцией ". [NHibernate in Action]