public static SalaryReport Get(int userID, int employeeID, int bussinessID, EmployeeFilter filter) { var result = new SalaryReport(filter); var employees = SalaryReport.FindEmployees(bussinessID, filter); foreach (var employee in employees) { var infos = SalaryCalculator.Find(employee.ID, filter.From, filter.To); dynamic record = new ExpandoObject(); var dictionary = (IDictionary <string, object>)record; dictionary.Add("Name", employee.Name); foreach (var info in infos) { result.Employees.Add(info); var month = info.Month.Value; if (!result.Months.Contains(month)) { result.Months.Add(month); } dictionary.Add(info.Month.Value.ToString("_MMyyyy"), filter.ViewBaseSalary ? info.BaseSalary > 0 ? info.BaseSalary : employee.BaseSalary : info.CalculatedTotal.Round()); } result.Records.Add(record); } result.Months = result.Months.OrderByDescending(i => i).ToList(); return(result); }