2016-11-23 8 views
2

私は過去2日間Entity Framework 6を​​使用するように私のプログラムを翻訳してきました。ほとんどの場合、私は単純なCRUD操作でそれを持っています。今日私は悩んだ。私は変換しようとしています。グループを使用してLinqで2つの列にMaxを取得しよう

Using SQLSERVER_Connection As New SqlConnection(GlobalVariables.SQLServer_Login_Details) 
     Using SQLCommand As New SqlCommand 
      Dim Command As New Text.StringBuilder 
      Command.AppendLine("SELECT TOP(1) EarningsYear AS PayYear, Max(EarningsAmt) AS EarnAmt, Max(Hours) AS HRS") 
      Command.AppendLine("FROM interview_payroll") 
      Command.AppendLine("GROUP BY CLIENTCODE, EarningsYear, SSN") 
      Command.AppendLine("HAVING CLIENTCODE = @CLIENTCODE AND SSN = @SSN ORDER BY EarningsYear DESC;") 
      SQLCommand.CommandText = Command.ToString 
      SQLCommand.Connection = SQLSERVER_Connection 
      SQLCommand.Parameters.Add("@CLIENTCODE", SqlDbType.VarChar).Value = sCLIENTCODE 
      SQLCommand.Parameters.Add("@SSN", SqlDbType.VarChar).Value = txtSSN.Text 
      SQLSERVER_Connection.Open() 
      Using Reader As SqlDataReader = SQLCommand.ExecuteReader() 
       While Reader.Read() 
        If Not IsDBNull(Reader("PayYear")) Then txtPayrollSourceDate.Text = CStr(Reader("PayYear")) 
        If Not IsDBNull(Reader("EarnAmt")) Then txtPayrollErnAmt.Text = CStr(Reader("EarnAmt")) 
        If Not IsDBNull(Reader("HRS")) Then txtPayrollHRS.Text = CStr(Reader("HRS")) 
       End While 
      End Using 
      SQLSERVER_Connection.Close() 
     End Using 
    End Using 

とLinq。

私はこれまで通りました。

Using DB As New wotcEntities 

     Dim Reader = From payroll In DB.interview_payroll 
        Where payroll.CONTROL = CONTROL And payroll.CLIENTCODE = sCLIENTCODE 
        Group payroll By payroll.CLIENTCODE, payroll.EarningsYear, payroll.SSN Into GPayroll = Group 



    End Using 

しかし、私はEarningsAmtとHoursでMAXを得るためにハードルを飛ばしているようではありません。私はこのプログラムを 'LINQ - サンプルクエリ'と呼びますが、MAXクエリは次のように表示されます。

Public Sub LinqToSqlCount08() 
    Dim latestHire = Aggregate emp In db.Employees _ 
        Into Max(emp.HireDate) 

    Console.WriteLine(latestHire) 
End Sub 

私はPayYearを含める場合はうまくいかないでしょう。

私はちょうど別々のクエリとして各部分をつかむことができますが、それは正しく感じません。

これを正しく行うにはどうすればよいですか?

答えて

0

アプリケーション「LINQPad」を強くお勧めします。それは本当にクエリを書いてすぐに結果を見るのに役立ちます。

私はあなたのクエリから収集できるものに似たテーブルを作成し、あなたが求めているものと信じているこのクエリを書くことができました。

「選択」は、最大集計が適用される場所です。

from payroll In Interview_payrolls 
where payroll.CLIENTCODE = sClientCode 
group payroll By payroll.CLIENTCODE, payroll.EarningsYear, payroll.SSN Into GPayroll = group 
select PayYear = EarningsYear, EarnAmt = GPayroll.Max(Function(p) p.EarningsAmt), HRS = GPayroll.Max(Function(p) p.Hours) 

希望します。

関連する問題