Я пробовал NHibernate 3 и LINQ для NHibernate.Я не могу заставить его выдать правильный запрос T-SQL.
Вот моя модель домена:
<code>Employee { id, name }
Department { id, name }
EmployeeDepartment { id, employee_id, department_id, startdate, enddate }
AttendanceRegistration { id, datetime, employee_id }
Теперь предположим, что яхотел бы выбрать все AttendanceRegistrations между '2010-10-1' и '2010-11-1', которые были подключены к определенному отделу в то время.
<code>DateTime start = new DateTime(2010,10,1);
DateTime end = new DateTime(2010,11,1);
var list =
from ar in session.Query<code><</code>AttendanceRegistration<code>></code>()
where
start <= ar.datetime && ar.datetime > end && (
from ed in session.Query<code><</code>EmployeeDepartment<code>></code>()
where
ed.startdate <= ar.datetime && ed.enddate > ar.datetime &&
ed.department_id = 1
select ed.employee_id
).Contains(ar.employee_id)
select ar;
Результирующий код SQL будет выглядеть так:
<code>
select ar.id, ar.datetime, ar.employee_id
from AttendanceRegistration ar
where
'2010-10-1 00:00:00' <= ar.datetime and '2010-11-1' > ar.datetime and exists (
select ed.employee_id
from EmployeeDepartment ed
where
ed.department_id=1 and
ed.startdate <= ar.datetime and
ed.enddate > ar.datetime and
ed.id=ar.employee_id
)
Это ПОЧТИ хорошо :-) Единственная ошибка:
<code>
ed.id=ar.employee_id
Это должно было быть:
<code>
ed.employee_id=ar.employee_id
У кого-нибудь есть идеи, как заставить LINQ to NHibernate выложить правильный запрос T-SQL?