代码之家  ›  专栏  ›  技术社区  ›  Alexander

NHibernate QueryOver RowCount,区分0和NULL

  •  1
  • Alexander  · 技术社区  · 6 年前

    我试图通过以下方式从员工那里获取所有活动任务 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() 退货 0 。 问题是我需要知道员工是否不存在,或者是否没有活动任务。

    我可以通过两个查询来实现这一点,首先获取员工并检查null,然后查询任务。但理想情况下,如果可能的话,我希望这一切都能在一个查询中完成。

    1 回复  |  直到 6 年前
        1
  •  1
  •   BartoszKP    6 年前

    使用LINQ到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() 
            });
    

    这将只返回具有适当任务数的现有员工。如果员工不存在,则返回空集合。由此生成的查询如下所示:

    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=?