не может получить доступ к нескольким записям из таблицы базы данных путем сравнения идентификаторов из списка & lt; ApplicationUser & gt; [Дубликат]

Это сработало для меня:

find ./ -type f -exec sed -i 's/string1/string2/' {} \;

Однако этого не произошло: sed -i 's/string1/string2/g' *. Возможно, «foo» не предназначался для string1 и «bar» not string2.

128
задан user2515186 13 October 2015 в 11:10
поделиться

4 ответа

Это не может работать, потому что ppCombined представляет собой набор объектов в памяти, и вы не можете присоединиться к набору данных в базе данных с другим набором данных, который находится в памяти. Вместо этого вы можете попытаться извлечь отфильтрованные элементы personProtocol коллекции ppCombined в память после , вы получили другие свойства из базы данных:

var persons = db.Favorites
    .Where(f => f.userId == userId)
    .Join(db.Person, f => f.personId, p => p.personId, (f, p) =>
        new // anonymous object
        {
            personId = p.personId,
            addressId = p.addressId,   
            favoriteId = f.favoriteId,
        })
    .AsEnumerable() // database query ends here, the rest is a query in memory
    .Select(x =>
        new PersonDTO
        {
            personId = x.personId,
            addressId = x.addressId,   
            favoriteId = x.favoriteId,
            personProtocol = ppCombined
                .Where(p => p.personId == x.personId)
                .Select(p => new PersonProtocol
                {
                    personProtocolId = p.personProtocolId,
                    activateDt = p.activateDt,
                    personId = p.personId
                })
                .ToList()
        });
177
ответ дан Slauma 21 August 2018 в 08:59
поделиться
  • 1
    Ключевая часть для меня заключалась в добавлении .AsEnumerable () // запрос базы данных заканчивается здесь, остальное - запрос в памяти – Sameer 3 June 2015 в 17:55
  • 2
    @Slauma Итак, если меня беспокоит производительность, я должен избегать этого, поскольку сначала он загружает все данные в память, а затем запрашивает его. Должен ли я писать raw sql для этих сценариев? – Arvand 28 December 2015 в 12:30
  • 3
    Похоже, @Arvand имеет большое значение. Если у вас есть большое количество записей перед фильтром, это может привести к огромному укусу из доступных ресурсов памяти. – spadelives 25 November 2016 в 02:53
  • 4
    @Slauma "Это не может работать, потому что ppCombined представляет собой набор объектов в памяти, и вы не можете присоединиться к набору данных в базе данных с другим набором данных, который находится в памяти. & Quot; Где я могу найти документацию о таких вещах? Мне действительно не хватает знаний о ограничениях EF, и когда я пытаюсь ограничить набор результатов запроса таким образом, эта некомпетентность становится очень очевидной и замедляет меня. – Nomenator 5 April 2017 в 21:31
  • 5
    Хорошая информация. Я добавляю это исключение в список наименее интуитивных сообщений об исключительных ситуациях. Это имеет смысл только после того, как вы поймете, почему это происходит. – DVK 6 March 2018 в 19:22

В моем случае я смог решить проблему, выполнив следующие действия:

Я изменил свой код на это:

var r2 = db.Instances.Where(x => x.Player1 == inputViewModel.InstanceList.FirstOrDefault().Player2 && x.Player2 == inputViewModel.InstanceList.FirstOrDefault().Player1).ToList();

К этому:

var p1 = inputViewModel.InstanceList.FirstOrDefault().Player1;
var p2 = inputViewModel.InstanceList.FirstOrDefault().Player2;
var r1 = db.Instances.Where(x => x.Player1 == p1 && x.Player2 == p2).ToList();
2
ответ дан Versatile 21 August 2018 в 08:59
поделиться
  • 1
    Это не работает для меня. Поскольку p1 и p2 находятся в памяти, объявлены ли они анонимно или по имени переменной. – Rahat Zaman 30 April 2018 в 15:31
  • 2
    Тип переменной не является проблемой. В моем случае ошибка была вызвана тем, что выполнял .FirstOrDefault () внутри предложения Where. – Versatile 30 April 2018 в 16:12

Не знаю, ищет ли кто-нибудь это. У меня такая же проблема. Выбор в запросе, а затем выполнение того, где (или объединение) и использование переменной выбора разрешили проблему для меня. (проблема была в коллекции «Reintegraties» для меня)

query.Select(zv => new
            {
                zv,
                rId = zv.this.Reintegraties.FirstOrDefault().Id
            })
            .Where(x => !db.Taken.Any(t => t.HoortBijEntiteitId == x.rId
                                             && t.HoortBijEntiteitType == EntiteitType.Reintegratie
                                             && t.Type == TaakType))
            .Select(x => x.zv);

надеюсь, что это кому-то поможет.

2
ответ дан William-H-M 21 August 2018 в 08:59
поделиться
  • 1
    zv.this.Reintegraties.FirstOrDefault().Id потенциальное исключение NullReferenceException – user 24 November 2016 в 07:12
0
ответ дан khaled saleh 1 November 2018 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: