Компоненты проекции NHibernate

58
7

Привет, ребята, я пытаюсь убрать DTO с помощью прогнозов в NHibernate, это мой код


IList<PatientListViewModel> list = 
y.CreateCriteria<Patient>()
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Birthdate"), "Birthdate")
.Add(Projections.Property("Doctor.Id"), "DoctorId")
.Add(Projections.Property("Gender"), "Gender")
.Add(Projections.Property("Id"), "PatientId")
.Add(Projections.Property("Patient.Name.Fullname"), "Fullname")
)
.SetResultTransformer(Transformers.AliasToBean<PatientListViewModel>())
.List<PatientListViewModel>();

этот код генерирует исключение? кто-нибудь знает, в чем проблема?


вот сообщение об ошибке


Message: could not resolve property: Patient.Name.Fullname of: OneCare.Domain.Entities.Patient

спросил(а) 2010-06-14T08:00:00+04:00 10 лет, 4 месяца назад
1
Решение
70

Вам нужно создать соединение с вашим свойством Parent.Name.


Итак, попробуйте перед установкой прогнозов для создания в псевдониме вашего свойства Patient.Name


e.q.


IList<PatientListViewModel> list = 
y.CreateCriteria<Patient>()
.CreateAlias("Name", "name")

.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Birthdate"), "Birthdate")
.Add(Projections.Property("Doctor.Id"), "DoctorId")
.Add(Projections.Property("Gender"), "Gender")
.Add(Projections.Property("Id"), "PatientId")
.Add(Projections.Property("name.Fullname"), "Fullname")
)


Извините, я не проверял это, так как все зависит от ваших классов объектов. Но идея в том, что вам нужно создать псевдоним.
Если вы не можете исправить проблему, укажите свои классы.


Обновлено!


Я создал два объекта: Patient and Doctor:


 public class Patient : AdvanceEntity
{
public virtual DateTime BirthDate { get; set; }

public virtual Doctor Doctor { get; set; }

public virtual int Gender { get; set; }

public virtual string Name { get; set; }
}

public class Doctor : AdvanceEntity
{
public virtual string Name { get; set; }
}

Далее репозиторий содержит только ваш запрос, переведенный в API критериев


public IList<Patient> GetPatientsForDoctor(long doctorId)
{
return this.Session.CreateCriteria(typeof(Patient), "patient")
.CreateAlias("patient.Doctor", "doc")
.Add(Restrictions.Eq("doc.Id", doctorId))
.List<Patient>()
;
}

И вот unittest и результат запроса


    [Test]
public void CanGetPatients()
{
var repository = new PatientRepository();
repository.GetPatientsForDoctor(1L);
}

и результат:


 NHibernate: SELECT this_.patientId as patientId70_1_, this_.birthDate as birthDate70_1_, this_.gender as gender70_1_, 
this_.name as name70_1_, this_.deletedDate as deletedD5_70_1_, this_.doctorId as doctorId70_1_,
this_.deletedById as deletedB7_70_1_, doc1_.doctorId as doctorId71_0_, doc1_.name as name71_0_,
doc1_.deletedDate as deletedD3_71_0_, doc1_.deletedById as deletedB4_71_0_
FROM Patients this_
inner join Doctors doc1_ on this_.doctorId=doc1_.doctorId
WHERE doc1_.doctorId = @p0;@p0 = 1

Как я уже сказал, вам нужно просто создать псевдоним и соединить таблицы между ними.
Но я думаю, что использование HQL в этом случае более правдоподобно. Используйте критерии только у вас есть динамические запросы. Как вы можете видеть, критерии выбирают все поля, которые могут создать недостаток производительности. Из couse вы работаете с простыми вещами, но в реальном приложении будьте очень осторожны с сгенерированными запросами.


Приятного дня!

ответил(а) 2010-06-14T12:03:00+04:00 10 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема