LINQ to NHibernate WHERE EXISTS IN

时间:2010-12-21 09:27:39

标签: nhibernate linq-to-nhibernate

我一直在尝试NHibernate 3和LINQ到NHibernate。我不能让它吐出正确的T-SQL查询。

这是我的域名模型:

Employee { id, name }
Department { id, name }
EmployeeDepartment { id, employee_id, department_id, startdate, enddate }
AttendanceRegistration { id, datetime, employee_id }

现在假设我想选择当时连接到某个部门的“2010-10-1”和“2010-11-1”之间的所有出勤登记。

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
            select ed.employee_id
    ).Contains(ar.employee_id)
    select ar;

生成的SQL代码如下所示:

<

这几乎是好的:-)唯一的错误是

>
这应该是:
<

有没有人有想法如何让LINQ to NHibernate吐出正确的T-SQL查询?

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。我找到了解决这个问题的方法。您的查询可以重写如下。基本上不是使用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;