2013-05-10 29 views
6

Tôi đang cố gắng sử dụng truy vấn LINQ để xác định số lượng từng loại đối tượng cụ thể mà tôi có và ghi lại các giá trị đó thành một loại ẩn danh.Truy vấn LINQ với GROUP BY và Count (*) vào Anonymous Type

Hãy nói rằng tôi có một số dữ liệu mà trông như thế này (có đang thực sự đối tượng phơi bày bất động sản này, nhưng nó sẽ làm việc như nhau)

GroupId 
1 
1 
2 
2 
2 
3 

tôi biết làm thế nào để định dạng truy vấn của tôi trong SQL. Nó sẽ là một cái gì đó như thế này:

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

Trong trường hợp này đầu ra sẽ là một cái gì đó giống như this:

GroupID Count 
1  2 
2  3 
3  1 

Làm thế nào tôi có thể làm điều tương tự với LINQ trong vb.net

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

Điều đó không hoàn toàn đúng, nhưng tôi nghĩ nó rất gần.

Ngoài ra, không biết nhiều về các loại ẩn danh, tôi có thể thực sự khai báo trước số groupCounts rằng nó sẽ là một liệt kê các mục mà mỗi nhóm có thuộc tính và đếm không?

Trả lời

7

Hãy thử sử dụng này trong LinqPad, và thể thay ra cho tổ chức cơ sở dữ liệu của bạn nó sẽ giúp bạn gần gũi hơn.

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

Tôi đã quen với C#:

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

Nhưng tôi đã thử nghiệm đoạn mã sau trong VB và nó hoạt động:

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

Vì vậy vb là một chút kỳ lạ khi nói đến dịch này cú pháp. Có vẻ như bạn chỉ có thể chèn các nhóm into một phần tử có tiêu đề chính xác "Group". Điều này sau đó cho thấy phần còn lại của các chức năng nhóm

From person In data 
Group person By grpId = person.GroupId Into Group 
Select id = grpId, count = Group.Count 
Các vấn đề liên quan