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

1つの方法は次のようになります。

最初にアイテムをグループ化し、次にグループごとに最新の日付を取得し、それらの最新の日付を持つアイテムを選択します。

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 に答える