LINQ to SQL выбирают из нескольких столбцов - PullRequest
1 голос
/ 02 апреля 2010

Я использую LINQ to SQL, чтобы выбрать несколько столбцов из одной таблицы. Я тоже хочу избавиться от дублированного результата.

Dim customer = (From cus In db.Customers Select cus.CustomerId, cus.CustomerName).Distinct

Результат:

  • 1 Дэвид
  • 2 Джеймс
  • 1 Дэвид
  • 3 Смит
  • 2 Джеймс
  • 5 Джо

Требуемый результат:

  • 1 Дэвид
  • 2 Джеймс
  • 3 Смит
  • 5 Джо

Может кто-нибудь показать мне, как получить желаемый результат? Спасибо.

Ответы [ 4 ]

1 голос
/ 30 сентября 2016

Вы можете использовать этот подход:

Dim distinctResult = customers.GroupBy(Function(cus) New With {Key cus.CustomerId, Key cus.CustomerName}) _
                              .Select(Function(cus) cus.First()) _
                              .ToList()
1 голос
/ 29 марта 2012
    Dim customer = From cus In db.Customers Order By cust.CustomerID Select cus.CustomerId, cus.CustomerName 

    For Each c In customer.Distinct()
        Listbox1.Items.Add(c.CustomerId & " " & c.CustomerName)
    Next

Должен предоставить вам список DISTINCT имен и идентификаторов клиентов.Не уверен насчет заказа.

1 голос
/ 11 июня 2012

Проблема, с которой вы столкнулись, состоит в том, что 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)

0 голосов
/ 03 апреля 2010

Вы должны использовать перегрузку Distinct, которая принимает IEqualityComparer. Некоторое время назад я ответил на аналогичный вопрос об Except на CodeProject, где я включил класс DelegateEqualityComparer, который позволяет просто использовать лямбда-выражения или другую функцию без необходимости фактически писать класс, реализующий компаратор.

http://www.codeproject.com/Messages/3244828/Re-How-do-I-do-an-effective-Except.aspx

Рекомендация о необходимости использования эквивалентных хеш-кодов, вероятно, применима как к Distinct, так и к исключением.

Чтобы использовать это с анонимными типами, вам, вероятно, понадобится вспомогательный метод для создания компаратора. Примерно так должно работать, если вы передаете запрос (конечно, перед вызовом Distinct) в качестве первого параметра, который заставит работать вывод типа.

Public Function CreateComparer(Of T)(
                   ByVal items As IEnumerable(Of T), 
                   ByVal comparison As Func(Of T, T, Boolean)
                ) As DelegateEqualityComparer(Of T)
    Return New DelegateEqualityComparer(Of T)(comparison)
End Function 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...