Проблема, с которой вы столкнулись, состоит в том, что VB.NET обрабатывает объекты, возвращаемые запросом Linq, иначе, чем C #, поэтому многие ответы здесь получены от озадаченных разработчиков C #. VB.NET возвращает изменяемые объекты из запросов Linq. C # возвращает неизменные объекты. Итак, в C # равенство уже обработано для вас, но в VB.NET вы должны указать, какие поля считаются равными, используя ключевое слово Key
. Вы можете легко увидеть это в LinqPad самостоятельно:
Dim items As New List(Of KeyValuePair(Of Integer, String))()
items.Add(New KeyValuePair(Of Integer, String)(1, "David"))
items.Add(New KeyValuePair(Of Integer, String)(2, "James"))
items.Add(New KeyValuePair(Of Integer, String)(3, "Smith"))
items.Add(New KeyValuePair(Of Integer, String)(2, "James"))
items.Add(New KeyValuePair(Of Integer, String)(5, "Joe"))
items.Dump()
Dim uhOhResult = (from a in items select New With {a.Key, a.Value}).Distinct()
usOhResult.Dump()
Dim distinctResult = (from a in items select New With {Key a.Key, Key a.Value}).Distinct()
distinctResult.Dump()
В вашем примере введите ключевое слово Key
, чтобы определить, какие поля участвуют в проверке на равенство, и различные будут работать правильно.
Dim customer = (From cus In db.Customers Select Key cus.CustomerId, Key cus.CustomerName).Distinct()
См. Здесь: Группа Linq на нескольких полях - VB.NET, Anonymous, Key
и здесь: Различаются в LINQ с анонимными типами (в VB.NET)