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