【问题标题】:SQL query to NHibernate querySQL 查询到 NHibernate 查询
【发布时间】: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


【解决方案1】:

你不想达到的更容易:

  • 如果您使用 NH 3.3.x.x 和 IQueryable 的
  • 或者如果您将选择分成两部分

但让我们尝试以其他方式解决问题:如果您不打算更改底层数据库,请使用 EF 进行查询/报告。 CQRS 是一种常用的实现模式。在过去 4-6 年我们实现的项目中,建议使用 EF 进行查询(NH 用于更新)非常普遍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多