2008-10-13 59 views
2
在VB中获取计数从分组数据表

我遇到一个心理障碍在这里和我希望我失去了一些东西明显。通过LINQ的

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

 
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()移动到Linq表达式的WHERE子句中,但是给了我同样的东西。

回答

2

Key是一个字符串。

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


改变选择,包括组

Select Key, SortOrder, Group 

,改变where子句来算组

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

另外,数组可能是矫枉过正。 “任何”可以通过简短的枚举节省时间。 (语法可能不完美,我不知道vb.linq)。

+0

啊,呃!这解释了为什么t.Key.Count()> 7(我正在尝试的一个测试)没有返回结果! – jerhinesmith 2008-10-13 15:16:25

0

我认为你需要一个GROUPBY在每条语句。

尝试像

For Each Entry in KeySortPairs.GroupBy(expression).Where(
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