LINQ Group By с несколькими параметрами

У меня есть приложение VB.NET и вы хотите сделать Group 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()

У меня есть записи нескольких человек, которые содержат одинаковое название города и название страны. Но выше запрос возвращает мне нулевые элементы. если я использую только один столбец Город или Страна, тогда он работает нормально.

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

Кто-нибудь укажет мне, где я ошибаюсь, с запросом Group By LINQ с несколькими параметрами.

Ответ 1

Проблема заключается в том, что только свойства Key в анонимных типах используются в равенстве и хэшировании в VB. (Все свойства в анонимных типах С# являются фактически ключевыми свойствами.) Поэтому вам просто нужно изменить свой запрос на:

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

Подробнее см. документацию для анонимных типов в VB.

Ответ 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