NHibernate QueryOver RowCount,区分0和NULL
NHibernate QueryOver RowCount, differentiate between 0 and NULL
我正在尝试通过 QueryOver
和 RowCount
获取员工的所有活动任务,代码如下:
var id = 1;
var activeTasks = Session
.QueryOver<Employee>()
.Where(emp => emp.id == id)
.JoinQueryOver<Tasks>(emp => emp.Tasks, JoinType.InnerJoin)
.Where(task => task.State == TaskState.Active)
.RowCount();
如果没有指定id
的员工,RowCount()
returns0
。
问题是我需要知道该员工是否不存在或是否没有活动任务。
我可以用 2 个查询来做到这一点,我首先获取员工并检查是否为 null,然后查询任务。但理想情况下,如果可能的话,我希望这一切都在一个查询中完成。
您可以使用 LINQ to NHibernate 来更简单:
var employeeWithActiveTaskCount = session
.Query<Employee>()
.Where(e => e.Id == id)
.GroupJoin(
session
.Query<Task>()
.Where(t => t.State == TaskState.Active),
e => e.Id,
t => t.Employee.Id,
(e, t) => new { Employee = e, Tasks = t })
.Select(et => new
{
EmployeeId = et.Employee.Id,
TaskCount = et.Tasks.Count()
});
这将 return 只有具有适当数量任务的现有员工。如果员工不存在,则 returned 为空集合。由此生成的查询如下所示:
select employee0_.Id as col_0_0_, (select cast(count(*) as INT)
from [Task] task1_ where task1_.State=?
and (task1_.Employee_id=employee0_.Id
or (task1_.Employee_id is null)
and (employee0_.Id is null)))
as col_1_0_ from [Employee] employee0_ where employee0_.Id=?
我正在尝试通过 QueryOver
和 RowCount
获取员工的所有活动任务,代码如下:
var id = 1;
var activeTasks = Session
.QueryOver<Employee>()
.Where(emp => emp.id == id)
.JoinQueryOver<Tasks>(emp => emp.Tasks, JoinType.InnerJoin)
.Where(task => task.State == TaskState.Active)
.RowCount();
如果没有指定id
的员工,RowCount()
returns0
。
问题是我需要知道该员工是否不存在或是否没有活动任务。
我可以用 2 个查询来做到这一点,我首先获取员工并检查是否为 null,然后查询任务。但理想情况下,如果可能的话,我希望这一切都在一个查询中完成。
您可以使用 LINQ to NHibernate 来更简单:
var employeeWithActiveTaskCount = session
.Query<Employee>()
.Where(e => e.Id == id)
.GroupJoin(
session
.Query<Task>()
.Where(t => t.State == TaskState.Active),
e => e.Id,
t => t.Employee.Id,
(e, t) => new { Employee = e, Tasks = t })
.Select(et => new
{
EmployeeId = et.Employee.Id,
TaskCount = et.Tasks.Count()
});
这将 return 只有具有适当数量任务的现有员工。如果员工不存在,则 returned 为空集合。由此生成的查询如下所示:
select employee0_.Id as col_0_0_, (select cast(count(*) as INT)
from [Task] task1_ where task1_.State=?
and (task1_.Employee_id=employee0_.Id
or (task1_.Employee_id is null)
and (employee0_.Id is null)))
as col_1_0_ from [Employee] employee0_ where employee0_.Id=?