EFCore: различия между двумя таблицами - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь понять различия между двумя таблицами, назовем их YestedayEmployees и TodaysEmployees. В настоящее время я получаю все обе таблицы, а затем проверяю каждый элемент, чтобы узнать, изменился ли статус сотрудника или они были удалены (они появляются во вчерашней, но не в сегодняшней таблице). Это было нормально, когда количество записей было меньше, но по мере увеличения количества записей сетевые и вычислительные ресурсы на моем сервере становятся проблемой. Есть ли способ сделать это с помощью запроса linq в EFCore? (или даже два - по одному для удаленного и один - для измененного)

1 Ответ

1 голос
/ 10 июля 2020

См. Следующий оператор запроса:

Тестовые данные (вы можете получить значение таблицы из базы данных, используя ядро ​​EF, более подробную информацию об использовании ядра EF с asp. net MVC, проверьте эту ссылку ):

        List<Employee> todayEmployees = new List<Employee>()
        {
            new Employee(){ EmpID=1001, EmpName="David", Status="OT" },
            new Employee(){ EmpID=1002, EmpName="Tom", Status="Off-line" },
            new Employee(){ EmpID=1003, EmpName="Jason", Status="OT" },
            new Employee(){ EmpID = 1004, EmpName="Dick", Status="Off-line" },
            new Employee(){ EmpID = 1005, EmpName="Cece", Status="OT" },
            new Employee(){ EmpID = 1006, EmpName="Dillion", Status="OT" },
            new Employee(){ EmpID = 1007, EmpName="Jeffery", Status="Off-Line" }
        };

        List<Employee> yesterdayEmployees = new List<Employee>()
        {
            new Employee(){ EmpID=1001, EmpName="David", Status="OT" },
            new Employee(){ EmpID=1002, EmpName="Tom", Status="OT" },
            new Employee(){ EmpID=1003, EmpName="Jason", Status="OT"},
            new Employee(){ EmpID = 1004, EmpName="Dick", Status="OT" },
            new Employee(){ EmpID = 1005, EmpName="Cece", Status="Off-Line" }
        };

Чтобы получить Сотрудник, статус которого изменен, мы могли бы использовать предложение Join и предложение where для сравнения статуса сотрудника:

        // get the employees which changes status
        var result = (from t in todayEmployees
                      join y in yesterdayEmployees
                      on t.EmpID equals y.EmpID
                      where (t.Status != y.Status)
                      select t).ToList();

Вывод:

enter image description here

        //get the employees status change information
        var query3 = (from t in todayEmployees
                      join y in yesterdayEmployees
                      on t.EmpID equals y.EmpID
                      where (t.Status != y.Status)
                      select new EmployeeViewModel()
                      {
                          EmpID = t.EmpID,
                          EmpName = t.EmpName,
                          StatusChangeLog = "change status from " + t.Status + " to " + y.Status
                      }).ToList();

Output:

enter image description here

To get the Employees which in the TodayEmployees Table, but not exist in the YesterdayEmployee Table, we could use the содержит метод для определения, содержит ли последовательность указанный элемент.

        //get the employees, which in TodayEmployees Table, but not exist in the YesterdayEmployee
        var query4 = (from t in todayEmployees 
                      where !(from y in yesterdayEmployees select y.EmpID).Contains(t.EmpID)
                      select t).ToList();

        var query5 = todayEmployees.Where(c => !yesterdayEmployees.Select(y => y.EmpID).Contains(c.EmpID)).Select(t => t).ToList();

Вывод:

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...