用Linq.从VB中的分组数据表中获取计数



我在这里遇到了一个心理障碍,我希望我错过了一些显而易见的东西。

不管怎样,假设我有一张这样的表:

ID查找值排序顺序============================================1 A 10002000年2月2000年3月4 C 30005 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

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

关键字排序顺序================A 1000B 2000C 3000C 4000

为了得到重复的Key,我正在查看这样的结果:

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

然而,在这段代码中,分组结果中的每个条目都会返回。我是不是遗漏了什么,或者这个计数不应该只给我Key不止一次出现的条目吗?我认为我犯了一个微不足道的错误,因为我对VB.NET的理解程度很低,但我无法理解——我曾尝试将Count()移动到Linq表达式上的WHERE子句中,但这给了我同样的结果。

Key是一个字符串。

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


更改选择以包括组

Select Key, SortOrder, Group

并更改where子句以计算组

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

或者,计算这个群体可能有些过头了。"Any"可以通过进行简短的枚举来节省时间。

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

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

我认为在for每条语句中需要一个groupby。

试试之类的东西

For Each Entry in KeySortPairs.GroupBy(expression).Where(

这真是个老问题。我只是在尝试。最初用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

相关内容

  • 没有找到相关文章

最新更新