【发布时间】:2014-06-04 09:50:56
【问题描述】:
我有一个 SQL 查询
select distinct e.ID, e.FIRST_NAME, e.LAST_NAME, ef.PROJECT, r.NAME
from EMPLOYEE as e
inner join [RANK] as r on r.ID = e.[RANK]
inner join [EMPLOYEE_FUNCTION_IN_PROJECT] as ef on e.ID = ef.EMPLOYEE
where ef.PROJECT
in (
select ef.PROJECT
from [EMPLOYEE_FUNCTION_IN_PROJECT] as ef
group by ef.PROJECT
having COUNT(distinct ef.EMPLOYEE) >= 3
)
and ef.[FUNCTION] = 1
现在我想转换成 NHibernate 查询。这是我到目前为止所做的
using (ITransaction myTransaction = mySession.BeginTransaction())
{
EmployeeDAO empDaoAlias = null;
Employee empAlias = null;
Group groupAlias = null;
Project projectAlias = null;
Rank rankAlias = null;
EmployeeFunctionInProject efpAlias = null;
var subquery = QueryOver.Of<EmployeeFunctionInProject>(() => efpAlias)
.Select(Projections.GroupProperty(
Projections.Property<EmployeeFunctionInProject>(e => e.Project)))
.Where(Restrictions.Gt(Projections.Count<EmployeeFunctionInProject>(e => e.Employee), 3));
empList = mySession.QueryOver<Employee>(() => empAlias)
.Inner.JoinAlias(() => empAlias.Rank, () => rankAlias)
//.Where(Restrictions.Eq(Projections.Property<Rank>(r => r.Id), 1)) //indicate this is group leader
.WithSubquery
.WhereProperty(() => empAlias.Id)
.In(subquery)
.Select(Projections.ProjectionList()
.Add(Projections.Property(() => empAlias.Id).WithAlias(() => empDaoAlias.Id))
.Add(Projections.Property(() => empAlias.FirstName).WithAlias(() => empDaoAlias.FirstName))
.Add(Projections.Property(() => empAlias.LastName).WithAlias(() => empDaoAlias.LastName))
.Add(Projections.Property(() => ??).WithAlias(() => empDaoAlias.Project))
.Add(Projections.Property(() => rankAlias.Name).WithAlias(() => empDaoAlias.Rank)))
.TransformUsing(Transformers.AliasToBean<EmployeeDAO>())
.List<EmployeeDAO>().ToList();
}
首先,我需要修改
.Add(Projections.Property(() => ??).WithAlias(() => empDaoAlias.Project))
显示项目 ID
其次,查询似乎无法正常工作,谁能帮我纠正这个问题?
提前致谢!!!
【问题讨论】:
-
您是否要投影到类实例 (
empDaoAlias.Project)?如果是这样,这在 QueryOver 中不起作用。
标签: nhibernate