2013-02-02 19 views
10

私はVB.NETアプリケーションを持っていて、複数の列にグループ化する必要があります。複数のパラメータを持つLINQグループBy

クラス構造:

Public Class Person 
    Public Property Name as String 
    Public Property City as String 
    Public Property Country as String 
End Class 

Dim oResult = PersonList _ 
       .GroupBy(Function(v) New With {v.City, v.Country}) _ 
       .Where(Function(grp) grp.Count > 1).ToList() 

私は、同じ都市名&国名が含まれている複数の人物の記録を持っています。しかし、上記のクエリは私にゼロのアイテムを返します。私は1つの列の都市または国を使用している場合、それは正常に動作しています。

Dim oResult = PersonList _ 
       .GroupBy(Function(v) v.City) _ 
       .Where(Function(grp) grp.Count > 1).ToList() 

誰かが、複数のパラメータを持つグループバイLINQクエリで間違っていると指摘しています。

答えて

18

問題は、匿名型のKeyプロパティのみがVBでの等価とハッシュで使用されることです。 (C#ですべてプロパティは匿名型が効果的に重要な性質である。)だから、あなただけにあなたのクエリを変更する必要があります。

Dim oResult = PersonList _ 
       .GroupBy(Function(v) New With { Key v.City, Key v.Country}) _ 
       .Where(Function(grp) grp.Count > 1).ToList() 

詳細はanonymous types in VBのドキュメントを参照してください。

+1

ありがとう!それは魅力のように働く。 –

2
Dim q1 = (From p In Repository.Table 
          Group p By p.CreatedDate.Year, p.CreatedDate.Month Into Group 
          Select New With {.Year = Year, .Month = Month, .Count = Group.Count()}).ToList 

それとも

Dim q2 = (From p In Repository.Table 
          Group p By key = New With {.Year = p.CreatedDate.Year, .Month = p.CreatedDate.Month} Into Group 
          Select New With {.Year = key.Year, .Month = key.Month, .Count = Group.Count()}).ToList