Как эффективно получить связанные строки в NHibernate? - PullRequest
0 голосов
/ 28 июля 2011

Предположим, у меня есть эти таблицы в моей базе данных, к которой обращается веб-служба (WCF) через NHibernate:

Table "Patients"
  Column "Id"
  Column "LastName"
  Column "FirstName"
  Column "Age"

Table "Treatments"
  Column "Id"
  Column "PatientId"
  Column "Name"
  Column "IsActive"

Пациент может пройти любое количество процедур. Если бы я хотел собрать список пациентов с их в настоящее время активным лечением, как я мог бы наиболее эффективно достичь этого в NHibernate?

В настоящее время я делаю это (с помощью SetFirstResult () и SetMaxResults (), конечно):

var patientsWithTreatments = new List<PatientWithTreatments>();

var patients = Session.CreateCriteria<Patient>().List<Patient>();
foreach(Patient patient in patients) {
  patientsWithTreatments.Add(
    new PatientWithTreatments(patient) {
      Treatments = Session.CreateCriteria<Treatment>()
        .Add(Restrictions.Eq("PatientId", patient.Id)).List<Treatment>()
    }
  );
}

Что включает в себя возврат к базе данных для каждого пациента в наборе результатов, что является довольно плохой идеей. Есть ли какая-то магия с простыми запросами NHibernate или мне придется использовать HQL (чего я пока не знаю):)

Ответы [ 2 ]

0 голосов
/ 09 февраля 2012

NHibernate имеет возможность добавлять отношения за кулисами (то есть они известны NHibernate, но не подвергаются воздействию кода) через access="noop" в файле сопоставления.

Затем их можно предположительно использовать как любые обычно объявленные отношения в HQL.

Начиная с NHibernate 3.1.0, для меня это было несколько неудобным побочным эффектом полного удаления всех строк, на которые есть ссылки, из другой таблицы прямо во время выполнения запроса, так что вы можете перепроверить перед использованием access="noop" в производственном коде.

0 голосов
/ 28 июля 2011

Вам необходимо иметь коллекцию в классе пациентов под названием «Лечение». В вашем отображении nHibernate у вас должно быть что-то вроде:

<many-to-one name="Treatments" column="TreatmentID" class="Treatment" fetch="select" cascade="none"/>

Затем вы можете получить все процедуры от пациента:

List<Treatment> treatments = yourPatient.Treatments;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...