【问题标题】:LINQ to DataTable, finding duplicate rowsLINQ to DataTable,查找重复行
【发布时间】:2024-05-02 11:45:03
【问题描述】:

使用以下数据表:

    Dim d As New DataTable()
    d.Columns.Add("Product", GetType(System.String))
    d.Columns.Add("Value", GetType(System.Double))

    d.Rows.Add(New Object() {"OAP1", 100.0})
    d.Rows.Add(New Object() {"EPP4", 100})
    d.Rows.Add(New Object() {"OAP1", 150.25})
    d.Rows.Add(New Object() {"OAPIN", 200.0})

我正在尝试使用 LINQ 来确定是否有多个任何类型的产品。在 SQL 中,这将类似于:

SELECT Product FROM SOME_TABLE HAVING COUNT(*) > 1

我终其一生都无法弄清楚如何在 LINQ 中执行此操作。我在关注一个做了这样的事情的人:

    Dim q = From row In d.AsEnumerable()
            Group row By New { column1 = row("Product"), column2 = row("Value") }
            Into grp
            Where grp.Count() > 1
            Select row

    For Each item In q
        ' 'q' is not declared. It may be inaccessible due to its protection level.
    Next

但是当我尝试实际使用 'q' 时出现错误。关于如何完成这项工作的任何想法?

【问题讨论】:

  • 您想对产品和价值进行分组吗?使用不会给您任何重复的示例数据。
  • 你是对的。我已经编辑了 SQL 查询以反映我真正想要的。我想查找重复的产品类型。

标签: vb.net linq datatable


【解决方案1】:

试试这个

Dim duplicates = d.AsEnumerable().GroupBy(Function(i) i.Field(Of String)("Product")).Where(Function(g) g.Count() > 1).Select(Function(g) g.Key)

For Each dup In duplicates
Next

【讨论】:

  • 不错且简单的解决方案。谢谢。
【解决方案2】:

我不确定 VB.NET 的查询语法,试试这个

Dim q = d.AsEnumerable().Select(Function(r) New With { .Column1 = r("Product"), .Column2 = r("Value")}) _
                    .GroupBy(Function(r) New With {r.Column1, r.Column2}) _
                    .Where(Function(g) g.Count() >1 )

For Each item In q
    Console.WriteLine(item.Key)
Next

【讨论】:

    【解决方案3】:

    试试吧

    Dim q = From row in d.AsEnumerable()
            Group row By row.Field(Of String)("Product")
            Into grp
            Where grp.Count() > 1
            Select { Country = row("Product"), Value = row("Value") }
    

    【讨论】:

    • 我试过了,得到了以下错误: Range variable name can be inferred only from a simple orqualified name without arguments.
    • 尝试使用字段扩展方法。