【问题标题】:Getting Count from Grouped DataTable in VB via Linq通过 Linq 从 VB 中的分组数据表中获取计数
【发布时间】:2010-09-16 21:45:30
【问题描述】:

我在这里遇到了心理障碍,我希望我遗漏了一些明显的东西。

无论如何,假设我有一个如下所示的表格:

ID 查找值排序顺序 ============================================ 1 个 1000 2 B 2000 3 B 2000 4 C 3000 5℃ 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

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

键排序顺序 ================= 一个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 子句中表达,但这给了我同样的东西。

【问题讨论】:

    标签: vb.net linq datatable


    【解决方案1】:

    键是一个字符串。

    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)。

    【讨论】:

    • 啊,呃!这就解释了为什么 t.Key.Count() > 7(我正在尝试的测试)没有返回任何结果!
    • 另外,计数组似乎不起作用。从逻辑上讲,我不确定这是否有意义,因为根据定义,group by 只会返回一个唯一的 Key,SortOrder 对——对吗?
    • linq 中的组是分层的,与 SQL 不同。一个组有一个键和一个或多个子元素。这些元素可以通过枚举组来访问。 msdn.microsoft.com/en-us/library/bb344977.aspx
    【解决方案2】:

    我认为你的每个语句都需要一个 groupby。

    试试类似的东西

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多