-1

はじめに、私はプログラマーとはかけ離れています。残念ながら、私が勤めていた会社の元従業員が作成した SQL を DB として使用して、ASP .NET Web ベースのインアウト ボードを変更する任務を負っています。プログラマーではないにもかかわらず、私の雇用主はこれを私に投げかけたいようです。

基本的に、次の関数の SQL クエリを変更して、「rsRank」列から最小値ではなく 2 番目に小さい値を取得する必要があります (基本的には、最高ランクの従業員ではなく、「In」のスタウトを持つ 2 番目にランクの高い従業員)。現在はそうです)。必要な値を取得するために問題なく SQL Management Studio で 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')] 

これはロングショットだと思いますが、誰かが少なくとも私を正しい方向に向けることができれば、大いに感謝します.

4

2 に答える 2

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;
        }
    }
于 2013-06-05T08:27:56.203 に答える