2013-05-10 12 views
6

Ich versuche, eine LINQ-Abfrage zu verwenden, um zu ermitteln, wie viele von jedem bestimmten Objekttyp ich habe, und diese Werte in einem anonymen Typ aufzuzeichnen.LINQ-Abfrage mit GROUP BY und Count (*) in anonymen Typ

Lassen Sie uns sagen, dass ich einige Daten haben, die wie folgt aussieht (es wirklich diese Eigenschaft Objekte auszusetzen, aber es wird die gleiche Arbeit)

GroupId 
1 
1 
2 
2 
2 
3 

Ich weiß, wie meine Abfrage in SQL zu formatieren. Es wäre so etwas wie dieses:

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

In diesem Fall ist der Ausgang so etwas wie this wäre:

GroupID Count 
1  2 
2  3 
3  1 

Wie kann ich die gleiche Sache mit LINQ in vb.net tun

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

Das ist nicht ganz richtig, aber ich denke, es ist in der Nähe.

Auch wenn ich nicht viel über anonyme Typen weiß, kann ich vorher groupCounts erklären, dass es sich um eine Aufzählung von Elementen handelt, die jeweils eine Gruppe und eine Zähleigenschaft haben?

Antwort

7

Versuchen Sie dies in LinqPad verwenden und für Ihre Datenbank Einheit aus die Haftung verbessernde es sollten Sie näher.

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 
14

ich zu C# verwendet:

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

Aber ich habe folgende Code-Schnipsel in VB getestet und es funktioniert:

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() 
2

So vb ein wenig seltsam ist, wenn es um die Übersetzung dieser kommt Syntax. Es scheint, dass Sie nur Gruppen into ein Element mit der genauen Bezeichnung "Group" einfügen können. Dies setzt dann den Rest der Gruppierung Funktionalität

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