Как фильтровать дубликаты в Entity Framework, чтобы минимизировать потерю производительности? - PullRequest
1 голос
/ 09 июня 2019

Как улучшить производительность кода, приведенного ниже?

Я загружаю carItems из внешнего веб-сервиса в список. carItem проверяется, существует ли он в EF. Если carItem новый, он сопоставляется с carsCol и добавляется в базу данных. Каковы простые способы улучшить производительность этого кода с помощью кода?

        carItems = carItems.Where(x => x.Name == "Tesla");

        // Filter existing cars
        List<Car> carsCol = new List<Car>();
        foreach (var item in carItems)
        {
            if (GetById(item.Id) == null)
            {
                carsCol.Add(item);
            }
        }

        Entities.AddRange(carsCol);

Ответы [ 3 ]

1 голос
/ 09 июня 2019

В зависимости от ситуации, вы можете попытаться выяснить, какие идентификаторы уже существуют в базе данных, сделав один запрос перед foreach.

var newCarItemIds = carItems.Select(x => x.Id);
var alreadyExistentCarItemIds = Entities.CarItems.Where(x => newCarItemIds.Contains(x.Id)).Select(x=>x.Id);

foreach(var item in carItems)
{
    if(!alreadyExistentCarItemIds.Contains(x))
    {
        carsCol.Add(item);
    }
}
0 голосов
/ 09 июня 2019

Я бы предложил это. Вы можете сделать left outter join с автомобилями, которые вы получаете от вашего API и существующего. Чем вы получите новые автомобили, которые будут добавлены.

var newCars = (from c in carItems 
          join e in Entities.CarItems on c.Id equals e.Id into g
          from x in g.DefaultIfEmpty()
          select new { c, IsNew = x == null }).Where(x = x.IsNew).ToList()

При этом вы делаете только один доступ к базе данных. Кроме того, при работе с IEnumerable всегда полезно преобразовать его в список или массив. Таким образом, каждый раз, когда вы выполняете итерацию по этому объекту, вы не выполняете запрос в своей базе данных.

0 голосов
/ 09 июня 2019

Вы можете использовать функции Distinct Linq: пример Вы должны реализовать интерфейс IEquatable

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