通过Linq在VB中从Grouped DataTable获取计数

时间:2008-10-13 14:57:37

标签: vb.net linq datatable

我在这里遇到了一个精神障碍,我希望我找不到明显的东西。

无论如何,假设我有一个看起来像这样的表:

ID            LookupValue         SortOrder
============================================
1             A                   1000
2             B                   2000
3             B                   2000
4             C                   3000
5             C                   4000

我正在尝试使用Linq查找LookupValue相同的位置,但排序顺序不同(ID是我的数据库表上的PK,与此无关运动)。

我认为最简单的方法是按LookupValueSortOrder进行分组,然后在结果中找到LookupValue出现两次以上的地方。

现在,我获取分组表的代码如下所示:

Dim KeySortPairs = From d In MyDataTable _
            Group By Key = d(LookupValue).ToString(), SortOrder = d(SortOrder).ToString() _
            Into Group _
            Select Key, SortOrder

查看调试输出,上面的代码产生了这个结果(这是正确的):

Key    SortOrder
================
A      1000
B      2000
C      3000
C      4000

要获得重复的Key,我正在查看结果如下:

For Each Entry In KeySortPairs.Where(Function(t) t.Key.Count() > 1)
    'Multiple Sort Orders!!'
Next

但是,在此代码中,将返回分组结果中的每个条目。我错过了什么,或者不应该只计算Key不止一次出现的条目?我认为由于我对VB.NET的低级安慰,我犯了一个微不足道的错误,但我无法弄清楚 - 我已经尝试将Count()移到WHERE关于Linq表达的条款,但这给了我同样的东西。

3 个答案:

答案 0 :(得分:2)

Key是一个字符串。

Key.Count计算字符串中的字符。


更改选择以包含组

Select Key, SortOrder, Group

并更改where子句以计算组

KeySortPairs.Where(Function(t) t.Group.Count() > 1)

或者,对小组进行统计可能有点过分。 “任何”都可以通过简短的枚举来节省时间。

KeySortPairs.Where(Function(t) t.Group.Skip(1).Any())

(语法可能不完美,我不知道vb.linq)。

答案 1 :(得分:0)

我认为你的每个声明都需要一个groupby。

尝试类似

的内容
For Each Entry in KeySortPairs.GroupBy(expression).Where(

答案 2 :(得分:0)

这是一个很老的问题。我只是在尝试。最初在C#中编写解决方案并通过一些在线转换器转换为VB.NET。希望不会冒犯任何人。

 Dim tests As New List(Of test)() From { _
            New test() With { _
                Key.LookUp = "A", _
                Key.SortOrder1 = 1000 _
            }, _
            New test() With { _
                Key.LookUp = "B", _
                Key.SortOrder1 = 2000 _
            }, _
            New test() With { _
                Key.LookUp = "B", _
                Key.SortOrder1 = 2000 _
            }, _
            New test() With { _
                Key.LookUp = "C", _
                Key.SortOrder1 = 3000 _
            }, _
            New test() With { _
                Key.LookUp = "C", _
                Key.SortOrder1 = 4000 _
            } _
        }

  Dim query = From g In From t In testsGroup t By t.LookUpLet firstsortorder = g.First() Where g.Count() > 1 AndAlso g.Any(Function(t1) firstsortorder.SortOrder1 <> t1.SortOrder1)New With { _
  g.Key, _
  Key .result = g _
}

    For Each item As var In query
        Console.WriteLine("key " + item.Key)
        For Each item1 As var In item.result
            Console.WriteLine(vbTab & vbTab & "sort order " + item1.SortOrder1)
        Next
    Next
相关问题