LINQ to NHibernate ГДЕ СУЩЕСТВУЕТ - PullRequest
       0

LINQ to NHibernate ГДЕ СУЩЕСТВУЕТ

2 голосов
/ 21 декабря 2010

Я пробовал 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?

1 Ответ

3 голосов
/ 13 февраля 2012

Я столкнулся с той же проблемой.Я нашел способ обойти это.Ваш запрос может быть переписан следующим образом.По сути, вместо использования оператора Contains () добавьте свой предикат явно в предложении where и используйте оператор Any ().

DateTime start = new DateTime(2010,10,1);
DateTime end = new DateTime(2010,11,1);
var list = 
from ar in session.Query<AttendanceRegistration>()
where 
    start <= ar.datetime && ar.datetime > end && (
        from ed in session.Query<EmployeeDepartment>()
        where
            ed.startdate <= ar.datetime && ed.enddate > ar.datetime &&
            ed.department_id == 1
            && ed.employee_id == ar.employee_id
        select ed
    ).Any()
select ar;
...