Linq с использованием группы по и в порядке возрастания

У меня есть две таблицы attendancelogs и employees со следующей структурой;

Таблица журналов посещаемости:

Attendancelogs

Att_Id
Registeration_Id
DateTime
CheckType

Таблица сотрудников:

Employees
Id
Emp_Id
Enroll_Id

Теперь я пытаюсь написать запрос, который будет извлекать из attendancelogs все записи, для которых значение CheckType указано как «Pending», а значение Registeration_Id равно Enroll_Id в таблице EmployeesOrderByAcsending на DateTime. Другими словами, получить все записи из таблицы посещаемости, чей RegistrationId равен Enroll_Id в таблице Employees и их CheckTypeis Pending and they should be orderbyascending according to theDateTime`

То, что я пробовал, было уродливым способом использования foreach.

//some method that populates a list
 ICollection<AttendanceLog> lstMachineInfo = manipulator.GetLogData(objZkeeper2, machineNum);
 List<Employee> empList = db.Employees.ToList();
  foreach (var emp in empList)
                        {
 var empLogs = lstMachineInfo.Where(x => x.RegisterationId == int.Parse(emp.EnrollNumber)).ToList();
 var prevDate = (from obj in empLogs select obj.Date).FirstOrDefault();
                            var prevDateTime = (from obj in empLogs select obj.DateTime).FirstOrDefault();
//and so on

Очевидно, что это очень дорого с точки зрения производительности, и у меня минимальные знания об оптимизации запросов.

Я бы посоветовал вам иметь в документации linq и присоединяется: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…

tomichel 11.04.2018 13:24
0
1
90
2

Ответы 2

вы можете попробовать следующий код в списке посещаемости и сотрудника

var result = from attendence in AttendenceList
                   orderby attendence.DateTime
                   join employee in EmployeeList on attendence.Registeration_Id equals employee.Enroll_Id into employeejoin
                   from employ in employeejoin
                   orderby attendence.DateTime ascending
                   where attendence.Registeration_Id == employ.Enroll_Id && attendence.CheckType == "Pending"
                   orderby attendence.DateTime ascending
                   select attendence;

Это то, что вы ищете?

//You are building your query to get all att ordered by date
var query = (from emp in db.Employees
             join att in db.Attendancelogs 
                 on emp.EnrollNumber equals att.RegisterationId 
             where att.CheckType.ToLower() == "pending"
             select att)
             .OrderBy(att => att.DateTime);

//You fire the query
List<Attendancelogs> attList = query.ToList();

Другие вопросы по теме