NHibernate — Как использовать проекции с путями ассоциаций, чтобы ограничить результирующий набор?

#c# #.net #nhibernate

#c# #.net #nhibernate

Вопрос:

Я создал свободное соглашение NHibernate, чтобы установить ‘Join’ в качестве режима выборки для всех ассоциаций «многие к одному» (на мой взгляд, нет смысла отправлять выборки для выборки по 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 столбцов, поэтому мне нужно указать с помощью Criteria API, что мне нужны только эти 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 » … свойства не существовали. Это привело к моему вопросу. Как я могу выполнить это, используя NHibernate criteria API?

Ответ №1:

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

 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")));