Multi-Entity GroupBy не выделяет различные значения - LINQ - PullRequest
1 голос
/ 27 января 2011

В настоящее время у меня есть довольно длинный оператор LINQ, который извлекает данные из двух таблиц: Employee и Time. Этот IQueryable отображается в Telerik RadGrid через источник данных Grids. Моя цель - показать Часы Работника за этот Период и позволить Пользователю загрузить Утвержденное Расписание в систему.

public static IQueryable GetUnimportedTimesheets()
{
    DataContext tData = new DataContext();

    var Times = tData.system_Times.Where(a => a.Status == 0)
        .OrderBy(a => a.Period)
        .ThenBy(a => a.system_Employee.LName)
        .GroupBy(a => new { a.Period , a.EmployeeID  } )
        .Select(x => new
        {
            Times = x.FirstOrDefault(),
            TotalReg = tData.system_Times
                .Where(b => b.EmployeeID == x.Key.EmployeeID && b.PayCode == "211")
                .Sum(b => b.Hours),
            TotalOT = tData.system_Times
                .Where(b => b.EmployeeID == x.Key.EmployeeID && b.PayCode == "212")
                .Sum(b => b.Hours),
            TotalTrav = tData.system_Times
                .Where(b => b.EmployeeID == x.Key.EmployeeID && b.PayCode == "214")
                .Sum(b => b.Hours),
            TotalSub = tData.system_Times
                .Where(b => b.EmployeeID == x.Key.EmployeeID && b.PayCode == "251")
                .Sum(b => b.Hours),
            FName = tData.system_Employees
                .Where(b => b.EmployeeID == x.Key.EmployeeID)
                .Select(c => c.FName).FirstOrDefault(),
            LName = tData.system_Employees
                .Where(b => b.EmployeeID == x.Key.EmployeeID)
                .Select(c => c.LName).FirstOrDefault(),
            Div = tData.system_Employees
                .Where(b => b.EmployeeID == x.Key.EmployeeID)
                .Select(c => c.Dept).FirstOrDefault(),
            AccID = tData.Pmsystem_Employees
                .Where(b => b.EmployeeID == x.Key.EmployeeID)
                .Select(c => c.AccountingID).FirstOrDefault(),
            Period = tData.system_Times
                .Where(b => b.EmployeeID == x.Key.EmployeeID)
                .Select(c => c.Period).FirstOrDefault(),
            Status = tData.system_Times
                .Where(b => b.EmployeeID == x.Key.EmployeeID)
                .Select(c => c.Status).FirstOrDefault()
        }
    );

    return Times;
}

Несмотря на то, что в начале инструкции для GroupBy я указывал и EmployeeID, и Period, выходные данные по-прежнему группируются только по EmployeeID. На изображении ниже показан текущий результат, который должен быть разделен на период и идентификатор сотрудника, а не только идентификатор сотрудника.

Current RadGrid

В чем может быть проблема с моим утверждением, и как я могу перевести его в на самом деле GroupBy ОБОИ периода и EmployeeID?

Ответы [ 2 ]

2 голосов
/ 27 января 2011

Ваш запрос выглядит излишне длинным и сложным. Короткий ответ на вашу проблему заключается в том, что вы ничего не делаете с созданной вами группировкой. Существует много возможностей для улучшения, но неясно, какова ваша схема, какие данные вы хотите и как вы хотите данные. Я думаю, что-то вроде этого - то, что вы ищете:

var query = from time in tData.system_Times
            orderby time.Period, time.system_Employee.LName
            group time by new { time.Period, time.EmployeeID } into employeeTimes
            join employee in tData.system_Employees
                on employeeTimes.Key.EmployeeID equals employee.EmployeeID
            select new
            {
                Times = employeeTimes,
                TotalReg = employeeTimes.Where(time => time.PayCode == "211")
                                        .Sum(time => time.Hours),
                TotalOT = employeeTimes.Where(time => time.PayCode == "212")
                                       .Sum(time => time.Hours),
                TotalTrav = employeeTimes.Where(time => time.PayCode == "214")
                                         .Sum(time => time.Hours),
                TotalSub = employeeTimes.Where(time => time.PayCode == "251")
                                        .Sum(time => time.Hours),
                FName = employee.FName,
                LName = employee.LName,
                Div = employee.Dept,
                AccID = employee.AccountingID,
                Period = employeeTimes.Key.Period,
                Status = employeeTimes.First().Status,
            };
0 голосов
/ 27 января 2011

Он должен работать так, как есть, но вы не используете точку для выбора, используйте его, как вы используете EmployeId

x.Key.Period
...