2013-06-25 66 views
12

Tôi có một bảng dữ liệu như thế này:LINQ truy vấn để tổng hợp theo nhóm

Category   Description  CurrentHours  CTDHours 
LC1    Cat One     5    0 
LC2    Cat Two     6    0 
LC3    Cat Three    18    0 
LC1    Cat One     0    9 
LC2    Cat Two     0    15 
LC4    Cat Four    0    21 

đó tôi cần phải Group và Sum này:

Category   Description  CurrentHours  CTDHours 
LC1    Cat One     5    14 
LC2    Cat Two     6    21 
LC3    Cat Three    18    0 
LC4    Cat Four    0    21 

Nói cách khác tôi cần phải tính tổng hai Giờ cột nhóm theo cột Loại và Mô tả.

Tôi biết rằng tôi có thể tạo bảng mới và lặp qua dữ liệu hiện có và tổng hợp dữ liệu vào bảng mới nhưng tôi nghĩ sẽ có cách dễ dàng hơn để thực hiện việc đó bằng cách sử dụng LINQ. Tôi đã googled nó cho một vài giờ nhưng tất cả các ví dụ tôi tìm thấy dường như không phù hợp với những gì tôi đã cố gắng để làm.

BTW, trình điều khiển odbc tạo bảng dữ liệu không có khả năng truy vấn phụ, v.v. hoặc tôi đã thực hiện nó bằng cách sử dụng SQL.

Cảm ơn,

John

Trả lời

30

Sử dụng ẩn danh đối tượng vào nhóm theo thể loại và mô tả. Dưới đây là LINQ truy vấn DataSet mà trả về giờ theo nhóm:

from r in table.AsEnumerable() 
group r by new { 
    Category = r.Field<string>("Category"), 
    Description = r.Field<string>("Description") 
} into g 
select new { 
    Category = g.Key.Category, 
    Description = g.Key.Description, 
    CurrentHours = g.Sum(x => x.Field<int>("CurrentHours"), 
    CTDHours = g.Sum(x => x.Field<int>("CurrentHours") + x.Field<int>("CTDHours")) 
} 

Nếu bạn đang truy vấn cơ sở dữ liệu (không rõ ràng từ câu hỏi):

from r in context.Table 
group r by new { 
    r.Category, 
    r.Description 
} into g 
select new { 
    g.Key.Category, 
    g.Key.Description, 
    CurrentHours = g.Sum(x => x.CurrentHours), 
    CTDHours = g.Sum(x => x.CTDHours + x.CurrentHours) 
} 
+0

Điều đó có hiệu quả. Cám ơn rất nhiều. BTW, làm thế nào bạn có được các cột của tôi để xếp hàng hoàn hảo như vậy? Tôi đã cố gắng tìm ra và thất bại. – John

+2

@ John tôi đã chọn các bảng và được định dạng là mã (nó giữ lại khoảng trắng) :) –

+2

@SergeyBerezovskiy cảm ơn vì đã cung cấp cả hai phiên bản, ** thật sự tuyệt vời ** :) –

0

Bạn cần phải tổng hợp CurrentHoursCTDhours, vì vậy -

select new { 
    ... 
    CTDHours = g.Sum(x => x.Field<int>("CTDHours") + g.Sum(x => x.Field<int>("CurrentHours") 
} 
Các vấn đề liên quan