在VS2010 Web项目中修改nhibernate的SQL查询

时间:2013-06-04 19:40:12

标签: sql nhibernate

前言,我远离程序员。遗憾的是,我的任务是使用SQL作为由我工作的公司的前雇员创建的数据库来修改基于ASP .NET网络的输入板。尽管不是程序员,我的雇主似乎仍然想把它扔给我,所以如果我太模糊,我会道歉。

基本上,我需要在以下函数中修改SQL查询以从" rsRank"中获取第二个最小值。列而不是最小的(基本上是排名第二的员工,排名为" In"而不是当前排名最高的员工)。我能够在SQL管理工作室中构建一个SQL查询,没有任何问题可以获得我需要的价值,但无法弄清楚如何将其实现到下面的代码中。我对nhibernate / HQL以及映射等的工作方式几乎一无所知。

    public Employee GetCurrentDesignatedRS()
    {
        using (ISession session = _nhHelper.OpenSession())
        {
            var employee = session.CreateQuery("from Employee emp1 where emp1.rsRank = (select min(emp2.rsRank) from Employee emp2 where emp2.Status = 'In' and emp2.rsRank > 0)").UniqueResult<Employee>();
            return employee;
        }
    }

下面是我创建的SQL查询,它可以获得我需要的值:

    select top 1 emp2.rsRank from Employee emp2 where emp2.rsRank > (select min(emp2.rsRank) from Employee emp2) and emp2.Status='In'

当然,如果我只是将其插入现有查询,我会得到以下异常:

    Message: Exception of type 'Antlr.Runtime.NoViableAltException' was thrown. near line 1, column 87 [from CompanyName.InOut.Library.Entities.Employee emp1 where emp1.rsRank = (select top 1 emp2.rsRank from CompanyName.InOut.Library.Entities.Employee emp2 where emp2.rsRank > (select min(emp2.rsRank) from CompanyName.InOut.Library.Entities.Employee emp2) and emp2.Status='In')] 

我认为这是一个很长的镜头,但如果有人能够指出我正确的方向,我将非常感激。

2 个答案:

答案 0 :(得分:0)

试试这个:

public Employee GetCurrentDesignatedRS()
    {
        using (ISession session = _nhHelper.OpenSession())
        {
            var employee = session.CreateSQLQuery("select top 1 emp2.rsRank from Employee emp2 where emp2.rsRank > (select min(emp2.rsRank) from Employee emp2) and emp2.Status='In'").UniqueResult<Employee>();
            return employee;
        }
    }

答案 1 :(得分:0)

这应该有效(未经测试):

        var employee = session.CreateQuery(
            "from Employee emp1 where emp1.rsRank > " +
            "(select min(emp2.rsRank) from Employee emp2 where emp2.Status = 'In' and emp2.rsRank > 0) " +
            " order by emp1.rsRank")
            .SetMaxResults(1)
            .UniqueResult<Employee>();

或者,如果您只需要排名而不是员工,那么您可以使用SQL查询:

var rank = session.CreateSQLQuery("select top 1 emp2.rsRank from Employee emp2 where emp2.rsRank > (select min(emp2.rsRank) from Employee emp2) and emp2.Status='In'")
                  .UniqueResult<int>();