2013-07-03 68 views
15

tôi có,Multi-Nhóm Cột Đếm LINQ

Một danh sách, MyList, các đối tượng với các lĩnh vực:

string A; 
string B; 

Về mặt lý thuyết, điều này cũng tương tự như một bảng SQL hai cột với cột A, B.

tôi đang cố gắng để tạo ra một biểu thức LINQ rằng sẽ tạo ra kết quả bộ ba cột này T-SQL trên một bảng khái niệm như:

SELECT A, B, COUNT(B) 
FROM T1 
GROUP BY A, B 

Nghĩa là, nếu tôi đã có một bảng như:

A  B 
---------- 
x  g 
x  g 
x  g 
x  s 
y  g 
y  g 

Tôi mong chờ:

A  B  COUNT(B) 
------------------------- 
x  g   3 
x  s   1 
y  g   2 

nỗ lực tốt nhất của tôi là thế này:

var result = from MyObjs in MyList 
group MyObjs by new { MyObjs.A, MyObjs.B } into g 
select new { g.Key.A, g.Key.B, g.Key.B.Count() } 

Nhưng số lượng dường như trả về tổng số B không phải là số B cho mỗi nhóm cột. Làm thế nào để sửa cái này?

+0

Điều quan trọng cần lưu ý là bạn không thực sự đếm B, bạn chỉ cần đếm (ví dụ trong SQL 'đếm (1)' sẽ làm việc chỉ là tốt). Đây là lý do tại sao câu trả lời của bạn trực giác không hoạt động. NinjaNye có giải pháp đóng đinh mặc dù nó có vẻ. :) – Chris

Trả lời

36

Hãy thử điều này .... (ra khỏi đỉnh đầu của tôi)

var result = from MyObjs in MyList 
group MyObjs by new { MyObjs.A, MyObjs.B } into g 
select new { g.Key.A, g.Key.B, MyCount = g.Count() } 

Hoặc nếu bạn thích ...

var result = MyList.GroupBy(x => new {x.A, x.B}) 
        .Select(g => new {g.Key.A, g.Key.B, MyCount = g.Count()}); 
+2

Nguyên tắc chính xác nhưng cú pháp hơi lệch trên dòng cuối cùng. Nên là 'chọn mới {A = g.Key.A, B = g.Key.B, Đếm = g.Count()}' –

+1

Chỉ các giá trị được tính toán (ví dụ: Đếm) phải được đặt tên. Đặt tên cho A và B là tùy chọn. –