Найдите различия между двумя списками в EF Core - PullRequest
0 голосов
/ 07 мая 2020

У меня два списка.

Список клиентов: один из них получает от пользователя (клиента)

Список серверов: один из них получает из базы данных.

Я хочу проделать 3 работы над этими списками.

Один: Добавить (если данные не существуют в Списке серверов и существуют в Списке клиентов)

Два: Удалить данные (если есть в список серверов и не существует в списке клиентов)

Три: Обновление (если данные существуют в списке серверов и клиентском сервере и данные изменились)

Это мой модель:

public class CategoryPropertyDto
{
    public Guid? Id { get; set; }
    public Guid CategoryId { get; set; }
    public string PropName { get; set; }
    public CategoryPropertyType CategoryPropertyType { get; set; }
}

клиент присылает мне список этой модели CategoryPropertyDto.

Теперь я пишу этот код для добавления данных:

var currentValue = getAllPropByCategory.Result.Select(x => new CategoryPropertyDto
            {
                CategoryId = x.CategoryId,
                CategoryPropertyType = x.CategoryPropertyType.CategoryPropertyType,
                Id = x.Id,
                PropName = x.PropName
            }).ToList();
            /// Add New Property
            var newProp = request.CategoryPropertyDtos.Where(x => x.Id == null).ToList();
            List<CategoryProperty> CategoryProperty = new List<CategoryProperty>();
            if (newProp.Count() > 0)
            {
                foreach (var item in newProp)
                {
                    CategoryProperty.Add(new CategoryProperty(item.PropName, item.CategoryPropertyType, item.CategoryId));
                }
                await unitOfWork.CategoryRepository.CategoryPropertyRepository.AddBulkCategoryProperty(CategoryProperty, cancellationToken);
            }

, и он работал хорошо.

Теперь я хочу найти элементы для удаления (существуют в списке серверов, но не существуют в списке клиентов)

 var removeValue = currentValue.Except(request.CategoryPropertyDtos).ToList();

, но это не сработало и вернуть все currentValue и я не «Не знаю, как найти элементы для обновления.

Как решить эту проблему?

1 Ответ

1 голос
/ 08 мая 2020

var removeValue = currentValue.Except (request.CategoryPropertyDtos) .ToList ();

Эта строка не работает, потому что в этом случае Except method сравнивает ссылки, а не значения и, очевидно, currentValue элементы имеют разные ссылки, чем элементы клиента.

решение: Вы должны использовать Id во всех случаях (добавление, удаление, обновление), как вы уже делали для добавления дела. Так, например, чтобы найти элементы для удаления:

var ItemIdsToDelete = currentValue.Select(p => p.Id).Except(request.CategoryPropertyDtos.Select(p => p.Id)).ToList();

и удалить элементы по идентификатору, используя такой метод:

await unitOfWork.CategoryRepository.CategoryPropertyRepository.DeleteBulkCategoryPropertyById(ItemIdsToDelete, cancellationToken);

, и вы можете сделать то же самое, чтобы найти элементы, идентификаторы которых существуют. в списках клиентов и серверов и обновите их.

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