LINQ查询使用GROUP BY和COUNT(*)到匿名类型(LINQ query with GROUP BY and Count(*) into Anonymous Type)

我试图使用LINQ查询来确定有多少每个特定对象类型我的这些值记录到一个匿名类型。

比方说,我有一些数据,看起来像这样(真的有对象暴露此属性,但它会工作相同)

GroupId
1
1
2
2
2
3

我知道如何格式化我的SQL查询。 这将是这样的:

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

在这种情况下,输出会是这样这条SQL小提琴

GroupID  Count
1        2
2        3
3        1

我怎样才能做到与LINQ同样的事情在vb.net

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

这是不完全正确的,但我觉得它很接近。

另外,不知道很多关于匿名类型,可我居然宣布groupCounts的时间提前,这将是每个有一组和计数属性项的枚举?

Answer 1:

尝试在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


Answer 2:

我已经习惯了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()


Answer 3:

所以VB是有点古怪,当涉及到翻译此语法。 看来你只能插入组into正好题为“一个元素Group ”。 这就暴露出的分组功能,其余

From person In data
Group person By grpId = person.GroupId Into Group
Select id = grpId, count = Group.Count