Запрос NHibernate CreateCriteria

Можно ли выбрать, какие столбцы я хочу получить взамен от Session.CreateCriteria()?

напр.:

var x = session.CreateCriteria();
    x.CreateAlias("EmployeePosition", "employeePosition");
    x.Add(Restrictions.Eq("employeePosition.Name", "Developer"));

и есть ли способ добавить что-то вроде «выбрать фамилию», чтобы избежать загрузки всей строки.


person Jacob    schedule 14.04.2010    source источник


Ответы (4)


создайте класс, который имеет только те свойства, которые вам нужны, часто это сводный класс, такой как {Id, Label}, и вы можете повторно использовать его везде, где вам нужен простой тип, например, в листинге. Используйте ProjectionList, чтобы определить, какие столбцы возвращать. Затем используйте Transformers.AliasToBean, чтобы преобразовать результат в ваш простой тип.

ProjectionList projectionList = Projections.ProjectionList();
projectionList.Add(Projections.Property("EmployeeID"), "Id");
projectionList.Add(Projections.Property("EmployeePosition"), "Label");
var x = DetachedCriteria.For(Employee);
x.SetProjection(projectionList);
x.SetResultTransformer(Transformers.AliasToBean(SimpleType)));
return x.GetExecutableCriteria(UnitOfWork.CurrentSession).List<SimpleType>();
person mhanney    schedule 14.04.2010

Вы можете сделать это с помощью проекций:

IList<Object[]> list = session.CreateCriteria(typeof(Employee))
  .SetProjection(Projections.ProjectionList()
    .Add(Projections.Property("FirstName"))
    .Add(Projections.Property("LastName"))
  ).List<Object[]>();

  foreach( Object[] person in list )
  {
    String firstName = person[0];
    String lastName = person[1];
  }

Проверьте пространство имен NHibernate.Expressions для других проекций.

person dana    schedule 14.04.2010

Я бы посоветовал попробовать Linq для NHibernate. Это позволит вам делать то, что вы просите, очень естественным образом.

person Tom Cabanski    schedule 14.04.2010
comment
В том-то и проблема, что в ней так много ошибок, что мне в этой конкретной ситуации она бесполезна. Я надеюсь, что они улучшат это в NH 3.0 - person Jacob; 15.04.2010
comment
Хм. Мы использовали его в довольно большом проекте без каких-либо затруднений. Возможно, мы недостаточно настаивали на этом, так как мы не имели дело со слишком большим количеством сложных объединений. - person Tom Cabanski; 15.04.2010

Чтобы добавить к ответу dana, если у вас есть реальный класс, в котором вы хотите его прочитать к, вы также можете использовать Transformers.AliasToBean с проекцией. Затем NHibernate попытается заполнить свойства объекта значениями из совпадающих имен полей.

person Chris Chilvers    schedule 14.04.2010