【问题标题】:Trying to use Group to get Max on two columns with Linq尝试使用 Group 在 Linq 的两列上获取 Max
【发布时间】:2017-04-07 23:55:14
【问题描述】:

过去两天我一直在翻译我的程序以使用 Entity Framework 6。在大多数情况下,我通过简单的 CRUD 操作来解决它。今天我遇到了一个障碍。我正在尝试转换;

    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 - Sample Queries”的程序,但它显示一个 MAX 查询;

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

    Console.WriteLine(latestHire)
End Sub 

如果我想包含 PayYear,这将不起作用。

我可以将每个部分作为单独的查询来获取,但这感觉不对。

我该如何正确地做到这一点?

【问题讨论】:

    标签: sql vb.net linq sql-server-2012 entity-framework-6


    【解决方案1】:

    我强烈推荐应用程序“LINQPad”。它确实有助于编写查询并立即查看结果。

    我创建了一个类似于我可以从您的查询中收集到的表,并且能够编写这个查询,我相信它可以满足您的要求。

    “选择”是应用 Max 聚合的地方。

    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)
    

    希望它对你有用。

    【讨论】:

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