LINQ to SQL选择与多列不同

时间:2010-04-02 16:48:35

标签: vb.net linq linq-to-sql

我正在使用LINQ to SQL从一个表中选择一些列。我也希望摆脱重复的结果。

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

结果:

  • 1 David
  • 2詹姆斯
  • 1 David
  • 3史密斯
  • 2詹姆斯
  • 5 Joe

通缉结果:

  • 1 David
  • 2詹姆斯
  • 3史密斯
  • 5 Joe

有人能告诉我如何获得想要的结果吗?感谢。

4 个答案:

答案 0 :(得分:1)

    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客户名称和ID的列表。不确定订购。

答案 1 :(得分:1)

您遇到的麻烦是VB.NET以不同于C#的方式处理从Linq查询返回的对象,这就是为什么这里的许多答案来自困惑的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关键字放入以定义参与相等性检查的字段,并且distinct将正常工作。

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

见这里:Linq Group on Multiple Fields - VB.NET, Anonymous, Key 在这里:Distinct in LINQ with anonymous types (in VB.NET)

答案 2 :(得分:1)

你可以使用这种方法:

Dim distinctResult = customers.GroupBy(Function(cus) New With {Key cus.CustomerId, Key cus.CustomerName}) _
                              .Select(Function(cus) cus.First()) _
                              .ToList()

答案 3 :(得分:0)

你应该使用带有IEqualityComparer的Distinct重载。我回答了一个关于CodeProject上的Except的类似问题,其中我包含了一个DelegateEqualityComparer类,它允许你只使用lambda或其他函数,而无需实际编写实现比较器的类。

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

关于需要等效哈希码的建议可能同样适用于Distinct和Except。

要将此与匿名类型一起使用,您可能需要一个帮助方法来创建比较器。如果您传入查询(当然,在调用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