Невозможно создать постоянное значение типа В этом контексте поддерживаются только примитивные типы или типы перечислений

Я получаю эту ошибку для запроса ниже

Невозможно создать постоянное значение типа API.Models.PersonProtocol. В этом контексте поддерживаются только примитивные типы или типы перечислений.

ppCombined ниже - это объект IEnumerable объекта PersonProtocolType, который создается concat из 2 PersonProtocol списков.

Почему это не удается? Разве мы не можем использовать предложение LINQ JOIN внутри SELECT для JOIN?

var persons = db.Favorites
    .Where(x => x.userId == userId)
    .Join(db.Person, x => x.personId, y => y.personId, (x, y) =>
        new PersonDTO
        {
            personId = y.personId,
            addressId = y.addressId,                   
            favoriteId = x.favoriteId,
            personProtocol = (ICollection<PersonProtocol>) ppCombined
                .Where(a => a.personId == x.personId)
                .Select( b => new PersonProtocol()
                 {
                     personProtocolId = b.personProtocolId,
                     activateDt = b.activateDt,
                     personId = b.personId
                 })
        });

Ответ 1

Это не может работать, потому что 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()
        });

Ответ 2

Не знаю, ищет ли кто-нибудь это. У меня такая же проблема. Выбор в запросе, а затем выполнение того, где (или объединение) и использование переменной выбора разрешили проблему для меня.  (проблема была в коллекции "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);

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