Group and Sum multiple columns with a calculation Linq

21 Reputation points
2022-05-13T18:15:00.673+00:00

Hi All,

I feel that what I am doing with my code here is really bad practice, or at least it feels that way.

I am working on a project which will be calculating peoples salary on a weekly basis, based on hours worked they will be paid overtime etc...

I am performing a join/group by then summing multiple colummns together. However, I am performing calculations inside of the group by, which feels wrong to me. I am wanting to know if theres a way of adding the summed columns together in a different manner to how I am performing it?

There are 4 different types of overtime payment in the month detailed below, which are Basic, Voluntary, extended and Other

HoursOnBankHolidayW3 = pg.Sum(x => x.ShiftDate >= vStart3 && x.ShiftDate <= weekThree ? x.Basic : 0)
+ pg.Sum(x => x.ShiftDate >= vStart3 && x.ShiftDate <= weekThree ? x.Voluntary : 0)
+ pg.Sum(x => x.ShiftDate >= vStart3 && x.ShiftDate <= weekThree ? x.Other : 0)
+ pg.Sum(x => x.ShiftDate >= vStart3 && x.ShiftDate <= weekThree ? x.ExtendedHours : 0) > 2250
? pg.Sum(x => x.ShiftDate == weekThree ? x.Voluntary : 0)
+ pg.Sum(x => x.ShiftDate == weekThree ? x.ExtendedHours : 0)
+ pg.Sum(x => x.ShiftDate == weekThree ? x.Other : 0)
+ pg.Sum(x => x.ShiftDate == weekThree ? x.Basic : 0) : 0,

So, the code above is being performed inside a group by query, I am checking if the summed hours in week 3 are greater than 2250 minutes (37.5) hours and if so, Sum the following values. This seems really cumbersome. and im wondering if theres a neater way to sum multiple columns and perform a calculation other than the above.

ASP.NET Core
ASP.NET Core
A set of technologies in the .NET Framework for building web applications and XML web services.
4,437 questions

1. 32,111 Reputation points Microsoft Vendor
2022-05-16T02:53:05.73+00:00

Hi @JROW ,

I am performing a join/group by then summing multiple colummns together. However, I am performing calculations inside of the group by, which feels wrong to me. I am wanting to know if theres a way of adding the summed columns together in a different manner to how I am performing it?

Without the table structure, it's hard to determine if there is a better way to achieve the same result. So, it is better to share the table structure or create a simple sample with the test data, so that we can easier to reproduce the problem and help you find a better way.

HoursOnBankHolidayW3 = pg.Sum(x => x.ShiftDate >= vStart3 && x.ShiftDate <= weekThree ? x.Basic : 0)

+ pg.Sum(x => x.ShiftDate >= vStart3 && x.ShiftDate <= weekThree ? x.Voluntary : 0)
+ pg.Sum(x => x.ShiftDate >= vStart3 && x.ShiftDate <= weekThree ? x.Other : 0)
+ pg.Sum(x => x.ShiftDate >= vStart3 && x.ShiftDate <= weekThree ? x.ExtendedHours : 0) > 2250
? pg.Sum(x => x.ShiftDate == weekThree ? x.Voluntary : 0)
+ pg.Sum(x => x.ShiftDate == weekThree ? x.ExtendedHours : 0)
+ pg.Sum(x => x.ShiftDate == weekThree ? x.Other : 0)
+ pg.Sum(x => x.ShiftDate == weekThree ? x.Basic : 0) : 0,

To the above code, you could try to use a where clause to filter the data, then use the Sum method to calculate the data. Code like this:

var pglist = new List<pgTest>()
{
new pgTest(){ Id=1, ShiftDate= new DateTime(2022,5,16,0,0,0), Basic = 12, ExtendedHours= 12, Other=11, Voluntary=21},
new pgTest(){ Id=1, ShiftDate= new DateTime(2022,5,17,0,0,0), Basic = 12, ExtendedHours= 12, Other=11, Voluntary=21},
new pgTest(){ Id=1, ShiftDate= new DateTime(2022,5,18,0,0,0),  ExtendedHours= 12, Other=11, Voluntary=21},
new pgTest(){ Id=1, ShiftDate= new DateTime(2022,5,19,0,0,0), Basic = 12, ExtendedHours= 12, Other=11, Voluntary=21},
new pgTest(){ Id=1, ShiftDate= new DateTime(2022,5,20,0,0,0),  ExtendedHours= 12, Other=11, Voluntary=21}
};

var vStart3 = new DateTime(2022,5,16,0,0,0);
var weekThree = new DateTime(2022, 5, 20, 0, 0, 0);

var query2 = pglist.GroupBy(c => c.Id).Select(c =>
{
// use a where clause filter the data first.
var pg = c.Where(x => x.ShiftDate >= vStart3 && x.ShiftDate <= weekThree).ToList();
return new
{
ShiftDate = c.Key,
HoursOnBankHolidayW4 = pg.Sum(x => x?.Basic)
+ pg.Sum(x => x?.Voluntary)
+ pg.Sum(x => x?.Other)
+ pg.Sum(x => x?.ExtendedHours) > 20
? (pg.Sum(x => x.ShiftDate == weekThree ? x.Voluntary : 0)
+ pg.Sum(x => x.ShiftDate == weekThree ? x.ExtendedHours : 0)
+ pg.Sum(x => x.ShiftDate == weekThree ? x.Other : 0)
+ pg.Sum(x => x.ShiftDate == weekThree ? x.Basic : 0)) : 0
};
});