我一直在尝试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查询?
答案 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;