Компоненты проекции NHibernate - PullRequest
1 голос
/ 14 июня 2010

Здравствуйте, ребята, я пытаюсь увлажнить 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

1 Ответ

2 голосов
/ 14 июня 2010

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

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

eq

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

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

Обновлено!

Я создал две сущности: Пациент и Доктор:

 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; }
}

Далеерепозиторий содержит только ваш запрос, переведенный в Criteria 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 в этом случае более правдоподобно.Используйте критерии только у вас есть динамические запросы.Как вы можете видеть, критерии выбирают все поля, которые могут привести к снижению производительности.Конечно, вы работаете с простыми вещами, но в реальном приложении будьте очень осторожны с сгенерированными запросами.

Хорошего дня!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...