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、グループとカウントのプロパティを持つアイテムの列挙になることを実際に事前に宣言できますか?

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 に答える