NHibernate - Как использовать проекции с путями ассоциаций, чтобы ограничить набор результатов? - PullRequest
0 голосов
/ 27 апреля 2011

Я создал соглашение Fluent NHibernate, чтобы установить «Присоединение» в качестве режима выборки для всех ассоциаций «многие к одному» (по моему мнению, нет смысла отправлять выборку для выборки 1 записи каждая). Проблема в том, что некоторые объекты имеют огромное количество столбцов (устаревшая база данных), и мне нужно ограничить набор результатов для создаваемого отчета.

Рассмотрим следующий пример:

class X 
{
  public int Id {get;set;}
  public virtual Y RefToY {get;set;}
  ...
}

class Y
{
  public int Id {get;set;}
  public virtual Z RefToZ {get;set;}
  ...
}

class Z
{
  public int Id {get;set;}
  public virtual String data1 {get;set;}
  public virtual String data2 {get;set;}
  public virtual String data3 {get;set;}
  ...
}

Представьте себе, что помимо свойств, которые я показал, у каждого из этих объектов есть еще 200 свойств, каждое из которых сопоставлено со столбцом.

Допустим, отчет, который мне нужно создать, основан на X (что означает, что критерии основаны на X), и мне нужно получить свойство X 'Id' и свойство Z data1 ',' data2 'и' data3 ' показать на DataGrid. Нет смысла извлекать набор результатов с 600 столбцами, поэтому мне нужно указать с помощью API Criteria, что мне нужны только эти 4 столбца. Как я могу быстро достичь этого? Я попытался установить проекции следующим образом:

var crit = Session.CreateCriteria<X>().SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Id"))
.Add(Projections.Property("RefToY.RefToZ.data1"))
.Add(Projections.Property("RefToY.RefToZ.data2"))
.Add(Projections.Property("RefToY.RefToZ.data3")));

Но это привело к ошибкам, говорящим: "RefToY.RefToZ.data1" ... свойства не существуют. Это привело к моему вопросу. Как я могу добиться этого с помощью API критериев NHibernate?

1 Ответ

4 голосов
/ 27 апреля 2011

Вам необходимо добавить объединение в критерии.Попробуйте ...

var crit = Session.CreateCriteria<X>()
    .CreateAlias("RefToY", "y")
    .CreateAlias("y.RefToZ", "z")
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("Id"))
        .Add(Projections.Property("z.data1"))
        .Add(Projections.Property("z.data2"))
        .Add(Projections.Property("z.data3")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...