Соединение между коллекцией в памяти и EntityFramework

Есть ли какой-либо механизм для выполнения JOIN между коллекцией в памяти и структурой сущностей с сохранением порядка.

Что Я пробую

var itemsToAdd = 
  myInMemoryList.Join(efRepo.All(), listitem => listitem.RECORD_NUMBER,
  efRepoItem => efRepoItem.RECORD_NUMBER, (left, right) => right);

, который дает мне довольно любопытное название «Этот метод поддерживает инфраструктуру LINQ to Entities и не предназначен для использования непосредственно из вашего кода». Ошибка.

Теперь, конечно, я могу делать это итеративно с помощью что-то вроде

        foreach (var item in myInMemoryList)
        {
            var ho = efRepo.Where(h => h.RECORD_NUMBER == item.RECORD_NUMBER).FirstOrDefault();
            tmp.Add(ho);
        }

, но это запрос N + 1. Что неприятно, поскольку myInMemoryList может быть довольно большим!

Resharper может реорганизовать его для меня до

        tmp = (from TypeOfItemInTheList item in myInMemoryList 
           select efRepo.Where(h => h.RECORD_NUMBER == item.RECORD_NUMBER)
           .FirstOrDefault());

, который, как я подозреваю, все еще выполняет запросы N + 1. Так что любой идеи для лучшего подхода к получению сущностей ef, которые совпадают (по ключевому полю) с коллекцией в памяти. Результирующий набор должен быть в том же порядке, что и коллекция в памяти.

15
задан abatishchev 26 April 2016 в 23:05
поделиться