1

给定一个具有“AccountNo”和“ExpiryDate”属性的简单 DTO (AccountExpiry) 以及由此创建的相同列表:

    New AccountExpiry(123, New Date(2012, 4, 1))
    New AccountExpiry(123, New Date(2012, 4, 2))
    New AccountExpiry(123, New Date(2012, 4, 3))

    New AccountExpiry(124, New Date(2012, 4, 2))
    New AccountExpiry(124, New Date(2012, 4, 3))
    New AccountExpiry(124, New Date(2012, 4, 4))

如何使用 LINQ 检索每个帐户的最新条目

我感觉这将涉及 GroupBy 和 FirstOrDefault。

这好像是...

From Item In Source Group By Item.AccountNo Into Group 

...应该返回适​​当分组的所有数据,但尚不清楚我如何将 .FirstOrDefault 应用于每个组。

我敢肯定,对于以前做过这件事的任何人来说,这都是一个简单的问题,但目前我还不清楚。

4

1 回答 1

2

一种方法是这样的:

首先将项目分组,然后获取每个组的最近日期,然后选择具有最近日期的项目。

Module Module1

    Class AccountExpiry
        Public Property AccountNo As Int32
        Public Property ExpiryDate As DateTime
        Public Sub New(accountNo As Int32, expiryDate As DateTime)
            Me.AccountNo = accountNo
            Me.ExpiryDate = expiryDate
        End Sub
    End Class

    Sub Main()

        Dim list = {New AccountExpiry(123, New Date(2012, 4, 1)),
                    New AccountExpiry(123, New Date(2012, 4, 2)),
                    New AccountExpiry(123, New Date(2012, 4, 3)),
                    New AccountExpiry(124, New Date(2012, 4, 2)),
                    New AccountExpiry(124, New Date(2012, 4, 3)),
                    New AccountExpiry(124, New Date(2012, 4, 4))}

        Dim grouped = From ae In list
                      Group ae By ae.AccountNo Into Group

        Dim newest = From g In grouped
                     Let maxDate = g.Group.Max(Function(e) e.ExpiryDate)
                     Select g.Group.Single(Function(e) e.ExpiryDate = maxDate)

        For Each x In newest
            Console.WriteLine(String.Format("{0} : {1}", x.AccountNo, x.ExpiryDate))
        Next

        Console.ReadKey()
    End Sub

End Module

请注意,如果在-group中不是唯一的,Single()则会失败。例如,您也可以使用,但这取决于您。ExpiryDateAccountNoFirst()

于 2012-04-16T09:12:34.577 回答