Nibernate Query Createcriterial
-
27-09-2019 - |
Вопрос
Можно ли выбрать, какие столбцы я хочу в обратной связи с Session.createcriteria ()?
ЭГЗ.:
var x = session.CreateCriteria();
x.CreateAlias("EmployeePosition", "employeePosition");
x.Add(Restrictions.Eq("employeePosition.Name", "Developer"));
И есть ли способ добавить что-то вроде «Выбрать фамилия», чтобы не загрузить всю строку.
Решение
Сделайте класс, который имеет только необходимые свойства, часто это является сводным классом, например, {ID, Label}, и вы повторно используете его где угодно, например, простой тип в списке. Используйте проекционный список, чтобы определить, какие столбцы возвращаются. Затем используйте 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>();
Другие советы
Вы можете сделать это, используя прогнозы:
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 для других прогнозов.
Я бы предложил дать Linq для Nibernate попробую. Это позволит вам делать то, что вы спрашиваете очень естественным образом.
Чтобы добавить в Дана Ответ, если у вас есть фактический класс, в котором вы хотите прочитать его, вы также можете использовать трансформаторы. Затем NHIBERNATE будет пытаться заполнить свойства объекта со значениями из соответствующих имен полей.