Обновление списка измененных элементов - PullRequest
0 голосов
/ 30 сентября 2019

В настоящее время для обновления списка я удаляю все элементы и вставляю все с нуля. Помимо неэффективности, это делает журналы аудита нечитаемыми, особенно когда списки велики.

В моем сервисе приложений я обновляю список следующим образом:

private async Task UpdateCourseTrainers(Course courseUpdateInputs)
{
    await _courseTrainerRepository.DeleteAsync(cd => cd.CourseId == courseUpdateInputs.Id);
    foreach (var trainer in courseUpdateInputs.CourseTrainers)
    {
        await _courseTrainerRepository.InsertAsync(trainer);
    }
}

Я думаю, это выглядело быкак то так:

private async Task UpdateCourseTrainers(Course courseInputEntity, Course savedCourse)
{
    var toInsert = courseInputEntity.CourseTrainers.Except(savedCourse.CourseTrainers).ToList();
    var toRemove = savedCourse.CourseTrainers.Except(courseInputEntity.CourseTrainers).ToList();

    await _courseTrainerRepository.DeleteAsync(???)

    foreach (var trainer in toInsert)
    {
        await _courseTrainerRepository.InsertAsync(trainer);
    }
}

Любая помощь будет оценена. Спасибо

1 Ответ

0 голосов
/ 01 октября 2019
private async Task UpdateCourseTrainers(Course courseInputEntity, Course savedCourse)
{            
   var toRemove = savedCourse.CourseTrainers.Except(courseInputEntity.CourseTrainers).ToList();          
   await _courseTrainerRepository.DeleteAsync(ct => toRemove.Any(t => t.TrainerId == ct.TrainerId));

   var toInsert = courseInputEntity.CourseTrainers.Except(savedCourse.CourseTrainers).ToList();
   foreach (var trainer in toInsert)
   {
      await _courseTrainerRepository.InsertAsync(trainer);
   }
}

А затем в классе CourseTrainer я реализовал IEquatable и добавил следующий код, чтобы позволить вышеупомянутому исключению работать

public bool Equals(CourseTrainer other)
{
   if (ReferenceEquals(other, null))
   {
      return false;
   }
   if (ReferenceEquals(this, other))
   {
      return true;
   }
   return CourseId.Equals(other.CourseId) && TrainerId.Equals(other.TrainerId);
}

public override int GetHashCode()
{
   int hashCourseId = CourseId.GetHashCode();
   int hashTrainerId = TrainerId.GetHashCode();
   return  hashCourseId ^ hashTrainerId;
}
...