Я получаю эту ошибку по запросу ниже
Невозможно создать постоянное значение типа
API.Models.PersonProtocol
. В этом контексте поддерживаются только примитивные типы или типы перечисления
ppCombined
ниже находится IEnumerable
объект PersonProtocolType
, который состоит из двух PersonProtocol
списков.
Почему это не удается? Разве мы не можем использовать JOIN
предложение LINQ внутри SELECT
a 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
})
});
c#
linq
entity-framework
join
user2515186
источник
источник
Ответы:
Это не может работать, потому что
ppCombined
это набор объектов в памяти, и вы не можете объединить набор данных в базе данных с другим набором данных, который находится в памяти. Вы можете попробовать вместо того, чтобы извлечь отфильтрованные элементыpersonProtocol
наppCombined
коллекции в памяти после того, как вы извлекли другие свойства из базы данных:источник
Не знаю, если кто-то ищет это. У меня такая же проблема. Выборка по запросу, а затем выполнение where (или join) и использование переменной select решили проблему для меня. (проблема была в сборнике "Реинтеграции" для меня)
надеюсь, это кому-нибудь поможет.
источник
zv.this.Reintegraties.FirstOrDefault().Id
потенциальный NullReferenceExceptionВ моем случае мне удалось решить проблему, выполнив следующие действия:
Я изменил свой код из этого:
К этому:
источник
p1
иp2
оба находятся в памяти, объявлены ли они анонимно или по имени переменной.Стоит добавить, так как пример кода OP не предоставляет достаточного контекста, чтобы доказать обратное, но я получил эту ошибку также в следующем коде:
По-видимому, я не могу использовать
Int32.Equals
в этом контексте для сравнения Int32 с примитивом int; Я должен был (безопасно) изменить это:источник
Equals
отлично.Просто добавьте AsEnumerable () и ToList (), чтобы это выглядело так
источник
У меня была эта проблема, и то, что я сделал и решил, это то, что я использовал
AsEnumerable()
непосредственно перед предложением Join. вот мой запрос:Мне было интересно, почему эта проблема возникает, и теперь я думаю, что это потому, что после того, как вы сделаете запрос через LINQ , результат будет в памяти и не загружен в объекты, я не знаю, что это за состояние, но в некоторых они переходное состояние я думаю. Затем, когда вы используете
AsEnumerable()
илиToList()
, и т. Д., Вы помещаете их в объекты физической памяти, и проблема решается.источник