Member 12286283 Ответов: 2

Как включить элементы groupby () в select () в linq to SQL queryi...


У меня есть запрос Linq to sql:

IEnumerable<PY_History_TransactionTAB> FilteredReport;

var ReportData = db.PY_History_TransactionTAB.AsEnumerable()
                 .Where(x => x.SystemCode == SysCode)
                 .GroupBy(x => new 
                 { 
                   x.EmployeeCode,
                   x.EmployeeMaster.Emp_FullName,
                   x.Designations.Title,
                   department = x.Departments.Title
                 });

FilteredReport = ReportData.Select(x => new PY_History_TransactionTAB
                {
                    EmployeeCode = x.Key.EmployeeCode,
                    H_SalaryDays = x.Sum(y => y.H_SalaryDays ?? 0),
                    H_NET_Overtime = x.Sum(y => y.H_NET_Overtime),
                    H_Overtime_Amount = x.Sum(y => y.H_Overtime_Amount),
                    H_SL_Breakup1 = x.Sum(y => y.H_SL_Breakup1 ?? 0),                       
                    H_OT_Allowance1 = x.Sum(y => y.H_OT_Allowance1 ?? 0),                      
                }).ToList();


Теперь, если я хочу добавить член GroupBy x. EmployeeCode в Select (), он принимает его и работает нормально, но я не знаю, как включить навигационное свойство x.EmployeeMaster.Emp_FullName в Select (), которое является следующим членом GroupBy (). Я знаю, что модель PY_History_TransactionTAB, на которую я ссылаюсь в Select (), не содержит определения для Emp_FullName, но она содержит определение для навигационного свойства, т. е. EmployeeMaster.

Итак, есть ли способ включить навигационное свойство x.EmployeeMaster.Emp_FullName в Select (), чтобы я мог получить доступ к ним в строго типизированном представлении?

Итак, мой вопрос заключается в том, как мне изменить свой запрос linq to sql, чтобы получить правильное представление результата?

Что я уже пробовал:

Я не знаю, как это сделать в c#, я попытался поместить свойство navigation в select (), и оно говорит, что PY_History_TransactionTAB не содержит определения Emp_FullName.

Richard Deeming

Не стал бы x.Key.Emp_FullName работа?

Member 12286283

Это правильно, но как я могу положить его в выберите() в качестве параметра, для employeecode я могу сказать : EmployeeCode = х.Ключ.EmployeeCode, это точно, но насчет Emp_FullName, я могу открыть его так, как вы сказали, но где я должен назначить его, PY_HistoryTransactionTAB только не содержит определение для "EmployeeMaster", которая сама по себе не столбец, но свойство навигации на другой стол.

Richard Deeming

В этом и заключается проблема повторного использования класса сущностей в качестве DTO - если он не соответствует структуре данных, которые вы хотите вернуть, вам придется прыгать через обручи, чтобы заставить его работать.

Попробуй: EmployeeMaster = x.First().EmployeeMaster

Member 12286283

Идеально! Это то решение, которое я искал, большое вам спасибо :) не могли бы вы изложить его как решение НИЖЕ, чтобы я мог принять его как ответ.

2 Ответов

Рейтинг:
17

Richard Deeming

Как обсуждалось в комментариях, поскольку вы повторно используете PY_History_TransactionTAB класс, и он не содержит Emp_FullName собственность, вам нужно будет извлечь EmployeeMaster с первой записи в группе:

FilteredReport = ReportData.Select(x => new PY_History_TransactionTAB
                {
                    EmployeeCode = x.Key.EmployeeCode,
                    EmployeeMaster = x.First().EmployeeMaster, // <-- Add this line.
                    H_SalaryDays = x.Sum(y => y.H_SalaryDays ?? 0),
                    H_NET_Overtime = x.Sum(y => y.H_NET_Overtime),
                    H_Overtime_Amount = x.Sum(y => y.H_Overtime_Amount),
                    H_SL_Breakup1 = x.Sum(y => y.H_SL_Breakup1 ?? 0),                       
                    H_OT_Allowance1 = x.Sum(y => y.H_OT_Allowance1 ?? 0),                      
                }).ToList();


Maciej Los

5ед!