I am trying to conditioanlly show a "week list"(each day of a week) either showing all 5 days(Mon-Fri), or a single "list item"(single list item represnting all days of week) based on if all items are the same for each day (with exception of key(s)). The following works until I add the "DayFunctions"(a list) as an item of the "week list". Is there something different that needs to be done when Grouping with a List property?
I have not been able to find anything in SO or even googling (for days) that addresses this specific Grouping issue.
UPDATED with Custom Comparer
//POCO
public class ScheduleWeek : IScheduleWeek
{
public int Id { get; set; }
public int Yr { get; set; }
public int WeekNo { get; set; }
public List<ScheduleDay> ScheduleDays { get; set; }
}
// POCO
public class ScheduleDay : IScheduleDay
{
public int Id { get; set; }
public int ScheduleWeekId { get; set; }
public string EmpId { get; set; }
public DateTime ScheduleDayDt { get; set; }
public Shift Shift { get; set; }
public Station Station { get; set; }
public List<DayFunction> DayFunctions { get; set; }
}
// POCO
public class DayFunction
{
public int ScheduleDayId { get; set; }
public int FunctionId { get; set; }
}
// HELPER METHOD
public async Task<List<ScheduleDay>> GetScheduleDaysWithDayFunctions(int stationId,
string empId,
int scheduleWeekId)
{
var sdlist = await _ctx.ScheduleDays
.Where(sd => sd.ScheduleDayDt.DayOfWeek != DayOfWeek.Sunday &&
sd.ScheduleDayDt.DayOfWeek != DayOfWeek.Saturday &&
sd.Station.Id == stationId &&
sd.EmpId == empId &&
sd.ScheduleWeekId == scheduleWeekId)
.Include(d => d.DayFunctions)
.ToListAsync();
return sdlist;
}
// HELPER METHOD
// ** ADDED CUSTOM COMPARER
public class ScheduleDayComparer : IEqualityComparer<ScheduleDay>
{
public bool Equals(ScheduleDay x, ScheduleDay y)
{
return x.Id == y.Id && x.DayFunctions
.SequenceEqual(y.DayFunctions);
}
public int GetHashCode(ScheduleDay x)
{
return x.Id.GetHashCode() ^ x.DayFunctions
.Aggregate(0, (a, y) => a ^ y.GetHashCode());
}
}
// MODEL FOR VIEW
public class ScheduleWeekViewModel
{
public ScheduleWeek ScheduleWeek { get; set; }
public ScheduleHelpers ScheduleHelpers { get; set; }
}
// MVC VIEW
@{
var scheduleDayComparer = new ScheduleHelpers.ScheduleDayComparer(); // <-- ADDED
var scheduledays = Model.ScheduleHelpers
.GetScheduleDaysWithDayFunctions(station.Id,
employee.Id.ToString(),
Model.ScheduleWeek.Id).Result
.GroupBy(x => x, scheduleDayComparer) // <-- ADDED
.Select(g => g.First()) // <-- ADDED
.ToList(); // <-- ADDED
//.GroupBy(sd => new
// {
// sd.Shift.Id,
// sd.DayFunctions // <-- this causes the grouping to break
// })
//.Select(g => g.First());
}
<table>
@foreach (var scheduleday in scheduledays)
{
<tr>
<td>
<text>SHIFT: @scheduleday.Shift.Name </text>
</td>
<td>
@foreach (var df in scheduleday.DayFunctions)
{
<text>DAY FUNCTIONS: @df.FunctionId </text>
}
</td>
</tr>
}
</table>
// CONTROLLER ACTION
public async Task<IActionResult> LocationScheduler()
{
var vm = new ScheduleWeekViewModel{};
var user = await _userManager.GetUserAsync(User);
vm.Employees = await _tcomsHelpers.GetEmployeesOfSupervisor(user);
vm.ScheduleDays = await _scheduleHelpers.GetScheduleWeekDaysForScheduler(vm.Employees);
vm.ScheduleWeek = await _scheduleHelpers.GetCurrentScheduleWeek();
vm.ScheduleHelpers = _scheduleHelpers;
return View(vm);
}