2012-07-20 38 views
8

dữ liệu của tôi trông giống như:LINQ lấy tổng của nhóm dữ liệu theo ngày

read_date | T1 | T2 | 
15.02.2000 | 2 | 3 | 
16.02.2000 | 4 | 5 | 
15.03.2000 | 2 | 3 | 
16.03.2000 | 5 | 4 | 

Tôi muốn nhận mountly tổng của T1 và T2, như thế này:

read_date | T1 | T2 | 
    02.2000 | 6 | 8 | 
    03.2000 | 7 | 7 | 

tôi cố gắng viết một cái gì đó như này:

var result = from s in meter_readings.Take(10) 
      group s by new { s.read_date} into g 
      select new 
      { 
       read_date = g.Key.read_date, 
       T1 = g.Sum(x => x.T1), 
       T2 = g.Sum(x => x.T2) 
      }; 

nhưng điều này không cho data.Is dự kiến ​​có bất kỳ ví dụ để cung cấp cho dữ liệu khoản tiền theo giờ, tiền hàng ngày, vv

Cảm ơn

Trả lời

17

Bạn chỉ nên lấy năm và tháng vào tài khoản khi nhóm:

var result = 
    from s in meter_readings.Take(10) 
    group s by new { date = new DateTime(s.read_date.Year, s.read_date.Month, 1) } into g 
    select new 
    { 
     read_date = g.Key.date, 
     T1 = g.Sum(x => x.T1), 
     T2 = g.Sum(x => x.T2) 
    }; 
+0

Cảm ơn rất nhiều, tôi làm việc. Đối với dữ liệu hàng ngày, tôi có nên viết "Ngày" thay vì "1" không? –

+1

@ AliRızaAdıyahşi có, bạn có thể sử dụng 'Day', hoặc bạn có thể sử dụng' s.read_date.Date' thay vì 'new DateTime (s.read_date.Year, s.read_date.Month, s.read_date.Day)', sẽ cho kết quả tương tự với ít mã hơn. – phoog

+0

Tuyệt vời! Cám ơn vì cái này. nó đã giúp tôi! – karbonphyber

0

Nhóm hiện tại của bạn theo nhóm sẽ theo ngày đầy đủ (tức là 15.02.2000 thay vì 02.2000). Điều đó sẽ kết thúc việc tạo một nhóm riêng lẻ cho mỗi ngày, không phải hàng tháng.

Thêm một .tháng vào nhóm bằng cách (giả sử đó là một đối tượng ngày):

group s by new { s.read_date.Month} into g 
+0

Điều này chỉ hoạt động nếu dữ liệu không kéo dài quá 12 tháng; nếu không, nó có thể tổng hợp dữ liệu từ, ví dụ, tháng 1 năm 2011 cùng với dữ liệu từ tháng 1 năm 2012 ('Tháng' cho tất cả các ngày đó sẽ là' 1'). – phoog

5

Trước tiên, tôi nghĩ rằng bạn có thể bỏ qua các loại vô danh:

var result = from s in meter_readings.Take(10) 
     group s by s.read_date into g 
     select new 
     { 
      read_date = g.Key, 
      T1 = g.Sum(x => x.T1), 
      T2 = g.Sum(x => x.T2) 
     }; 

thứ hai, để nhóm theo tháng, sử dụng một số giá trị mà sẽ uniq uely xác định tháng, như thế này:

var result = from s in meter_readings.Take(10) 
     group s by s.read_date.ToString("yyyy.MM") into g 
     select new 
     { 
      read_month = g.Key, 
      T1 = g.Sum(x => x.T1), 
      T2 = g.Sum(x => x.T2) 
     }; 
0
static void Main() 
    { 
     var list = new List<meter_reading> 
         { 
          new meter_reading {Date = new DateTime(2000, 2, 15), T1 = 2, T2 = 3}, 
          new meter_reading {Date = new DateTime(2000, 2, 10), T1 = 4, T2 = 5}, 
          new meter_reading {Date = new DateTime(2000, 3, 15), T1 = 2, T2 = 3}, 
          new meter_reading {Date = new DateTime(2000, 3, 15), T1 = 5, T2 = 4} 
         }; 
      var sum = list 
      .GroupBy(x => GetFirstDayInMonth(x.Date)) 
      .Select(item => new meter_reading 
           { 
            Date = item.Key, 
            T1 = item.Sum(x => x.T1), 
            T2 = item.Sum(x => x.T2), 
           }).ToList(); 
    } 

    private static DateTime GetFirstDayInMonth(DateTime dateTime) 
    { 
     return new DateTime(dateTime.Date.Year, dateTime.Date.Month, 1); 
    } 
0
query.OrderBy(o => o.OrderDate) 
       .GroupBy(o => DbFunctions.CreateDateTime(o.OrderDate.Year, o.OrderDate.Month, 1, 0, 0, 0)) 
         .Select(group => new DateIncomeDto { Date = group.Key.Value, Income = group.Sum(item => item.PayFee ?? 0) }); 

Nó làm việc cho tôi!

Các vấn đề liên quan