2016-10-05 4 views
0

私はbillableHoursとnonBillableHoursの合計を取得する必要があります。linq複数の値の合計

これは私のコードです。

var currentMonth = 10; 

var userQuery = 
      from timeEntry in TimeEntries 
      join ta in Tasks on timeEntry.TaskID equals ta.TaskID 
      where timeEntry.DateEntity.Month == currentMonth && timeEntry.DateEntity.Year == DateTime.Today.Year 
      select new 
      { 
       HoursEntered = timeEntry.HoursEntered, 
       Billable = ta.Billable 
      }; 

      var localrows = userQuery.ToList(); 
      var grouping = localrows.GroupBy(x => x.Billable); 

      var userList = grouping.Select(q => new 
      { 
       billableHours = q.Where(x=> x.Billable == true), 
       nonBillableHours = q.Where(x=> x.Billable != true) 
      }); 

私は合計を得る方法を見つけることができないようです。 私はそれらの2つの列の合計が必要なので、私はそれらを呼び出すことができます と私はそれらから得る値を計算します。

答えて

1

グループを必要としません。この文字列で検索してください:

var userQuery = 
    from timeEntry in TimeEntries 
    join ta in Tasks on timeEntry.TaskID equals ta.TaskID 
    where timeEntry.DateEntity.Month == currentMonth 
     && timeEntry.DateEntity.Year == DateTime.Today.Year 
    select new 
    { 
     HoursEntered = timeEntry.HoursEntered, 
     Billable = ta.Billable 
    }; 

var billableHours = userQuery 
    .Where(m => m.Billable) // Billable 
    .Select(m => m.HoursEntered) 
    .DefaultIfEmpty(0) 
    .Sum(); 

var nonBillableHours = userQuery 
    .Where(m => !m.Billable) // Non-bilable 
    .Select(m => m.HoursEntered) 
    .DefaultIfEmpty(0) 
    .Sum(); 
+0

素晴らしい作品。 defaultifemptyが、linqpadでサポートされていないオーバーロードのエラーを返します。 – andrelange91

+0

私はそれが助けられてうれしいです。 'HoursEntered'のタイプは何ですか? –

+0

これはダブルです。 – andrelange91

2

複数の集約が必要な場合、あなたはまだgroup by定数技術を用いて単一のクエリで結果を得ることができます。これは、この特定のケースで条件Sumと組み合わせることができます。

var hoursInfo = 
    (from timeEntry in TimeEntries 
    join ta in Tasks on timeEntry.TaskID equals ta.TaskID 
    where timeEntry.DateEntity.Month == currentMonth && timeEntry.DateEntity.Year == DateTime.Today.Year 
    group new { timeEntry.HoursEntered, ta.Billable } by 1 into g 
    select new 
    { 
     BillableHours = g.Sum(e => e.Billable ? e.HoursEntered : 0), 
     NonBillableHours = g.Sum(e => !e.Billable ? e.HoursEntered : 0), 
    }).FirstOrDefault(); 
0
var currentMonth = 10; 
     var TimeEntries = new List<TimeEntry>() { 
     new TimeEntry(){TaskID = 1,DateEntity = DateTime.Now.AddDays(1),HoursEntered =2}, 
     new TimeEntry(){TaskID = 2,DateEntity = DateTime.Now.AddDays(2),HoursEntered =3}, 
     new TimeEntry(){TaskID = 3,DateEntity = DateTime.Now.AddDays(3),HoursEntered =2}, 
     new TimeEntry(){TaskID = 4,DateEntity = DateTime.Now.AddDays(4),HoursEntered =4}, 
     new TimeEntry(){TaskID = 5,DateEntity = DateTime.Now.AddDays(5),HoursEntered =2}, 
     new TimeEntry(){TaskID = 6,DateEntity = DateTime.Now.AddDays(6),HoursEntered =6} 
     }; 

     var UserTasks = new List<UserTask>(){ 
       new UserTask(){TaskID = 1,Billable = true} , 
       new UserTask(){TaskID = 2,Billable = false} , 
       new UserTask(){TaskID = 3,Billable = true} , 
       new UserTask(){TaskID = 4,Billable = false} , 
       new UserTask(){TaskID = 5,Billable = true} , 
       new UserTask(){TaskID = 6,Billable = false} 
     }; 

     var userQuery = 
        from x in 
         (from timeEntry in TimeEntries 
         join ta in UserTasks on timeEntry.TaskID equals ta.TaskID 
         where timeEntry.DateEntity.Month == currentMonth && timeEntry.DateEntity.Year == DateTime.Today.Year 
         select new 
         { 
          HoursEntered = timeEntry.HoursEntered, 
          Billable = ta.Billable 
         }) 
        group x by x.Billable into g 
        select new 
        { 
         IsBillable = g.Key, 
         Billabe = g.Where(t => t.Billable == true).Sum(x => x.HoursEntered), 
         NonBillable = g.Where(t => t.Billable == false).Sum(x => x.HoursEntered) 
        }; 

     foreach (var item in userQuery.ToList()) 
     { 
      Console.WriteLine(string.Format("{0} - {1}", item.IsBillable? "Billable":"Non-Billable",item.IsBillable?item.Billabe:item.NonBillable)); 

     }