7

我正在尝试使用 LINQ 查询来确定我拥有的每种特定对象类型的数量,并将这些值记录到匿名类型中。

假设我有一些看起来像这样的数据(确实有对象暴露了这个属性,但它的工作原理是一样的)

GroupId
1
1
2
2
2
3

我知道如何在 SQL 中格式化我的查询。它会是这样的:

SELECT grp = GroupId, cnt = COUNT(*)
FROM myTable
GROUP BY GroupId

在这种情况下,输出将类似于SQL Fiddle

GroupID  Count
1        2
2        3
3        1

如何在 vb.net 中使用 LINQ 做同样的事情

Dim groupCounts = From person In data
                  Group By person.GroupId
                  Select new {group = person.GroupId, count = count(*)}

这不太正确,但我认为它很接近。

另外,对匿名类型了解不多,我是否可以groupCounts提前声明它将是每个具有 group 和 count 属性的项目的枚举?

4

3 回答 3

16

我习惯了 C#:

var query = from person in data
            group person by person.GroupId into grouping
            select new { Key = grouping.Key, Count = grouping.Count() }

但我已经在 VB 中测试了以下代码段并且它有效:

Dim files = Directory.GetFiles (Path.GetTempPath()).Take (100).ToArray().AsQueryable()

Dim groups = From f In files Group f By key = Path.GetExtension (f) Into Group
             Select Key = key, NumberGroup = Group.Count()
于 2013-05-10T19:33:06.700 回答
7

尝试在 LinqPad 中使用它,并为您的数据库实体替换它应该让您更接近。

Public Sub grouper2()
    Dim numbers = New Integer() {1,1,2,2,2,3}

    Dim numberGroups = From w In numbers _
                    Group w By Key = w Into Group _
                    Select Number = Key, numbersCount = Group.Count()

    'linqpad specific output
    'numberGroups.Dump()

    For Each g In numberGroups
        Console.WriteLine("Numbers that match '{0}':", g.Number)
            Console.WriteLine(g.numbersCount)        
    Next

End Sub
于 2013-05-10T20:04:19.830 回答
2

所以 vb 在翻译这个语法时有点奇怪。看来您只能插入组into一个标题正好为“”的元素Group。然后,这会公开其余的分组功能

From person In data
Group person By grpId = person.GroupId Into Group
Select id = grpId, count = Group.Count
于 2013-05-10T20:02:48.743 回答