EF Нестатический метод требует целевого
У меня серьезные проблемы со следующим запросом.
context.CharacteristicMeasures
.FirstOrDefault(cm => cm.Charge == null &&
cm.Characteristic != null &&
cm.Characteristic.Id == c.Id &&
cm.Line != null &&
cm.Line.Id == newLine.Id &&
cm.ShiftIndex != null &&
cm.ShiftIndex.Id == actShiftIndex.Id &&
(newAreaItem == null ||
(cm.AreaItem != null &&
cm.AreaItem.Id == newAreaItem.Id)));
Я получаю a TargetException: Non-static method requires a target
, когда newAreaItem имеет значение null.
Если newAreaItem не null, я получаю NotSupportedException: Unable to create a constant value of type 'PQS.Model.AreaItem'. Only primitive types or enumeration types are supported in this context.
Вещи, которые я уже проверил, если они имеют значение null:
c, newLine, actShiftIndex все 3 переменные не являются нулевыми, и идентификатор доступен.
Я не понимаю... пожалуйста, помогите.
Если вам нужна дополнительная информация... не стесняйтесь спрашивать...
UPDATE
Я мог бы удалить NotSupportedException
, но у меня все еще есть TargetException, когда мой newAreaItemIsNull прав...:/
bool newAreaItemIsNull = (newAreaItem == null);
var mc = context.CharacteristicMeasures
.FirstOrDefault(cm => cm.Charge == null &&
cm.Characteristic != null &&
cm.Characteristic.Id == c.Id &&
cm.Line != null &&
cm.Line.Id == newLine.Id &&
cm.ShiftIndex != null &&
cm.ShiftIndex.Id == actShiftIndex.Id &&
(newAreaItemIsNull ||
(cm.AreaItem != null &&
cm.AreaItem.Id == newAreaItem.Id)));
UPDATE
Я, наконец, сделал это. Кажется, что синтаксический анализ запроса не может проанализировать мой newAreaItem(IsNull)
, потому что он не в модели БД каким-то образом!?
Мне нужно разделить мои запросы.
bool newAreaItemIsNull = (newAreaItem == null);
MeasureCharacteristic mc;
if (newAreaItemIsNull)
mc = context.CharacteristicMeasures
.FirstOrDefault(cm => cm.Charge == null &&
cm.Characteristic != null &&
cm.Characteristic.Id == c.Id &&
cm.Line != null &&
cm.Line.Id == newLine.Id &&
cm.ShiftIndex != null &&
cm.ShiftIndex.Id == actShiftIndex.Id);
else
mc = context.CharacteristicMeasures
.FirstOrDefault(cm => cm.Charge == null &&
cm.Characteristic != null &&
cm.Characteristic.Id == c.Id &&
cm.Line != null &&
cm.Line.Id == newLine.Id &&
cm.ShiftIndex != null &&
cm.ShiftIndex.Id == actShiftIndex.Id &&
cm.AreaItem != null &&
cm.AreaItem.Id == newAreaItem.Id);
Кто-нибудь знает лучшее решение?
Ответы
Ответ 1
Попробуйте переместить newAreaItem == null
вне запроса
bool newAreaItemIsNull = (newAreaItem == null);
и замените newAreaItem == null
на newAreaItemIsNull
в запросе.
Парсер запросов может работать только с объектами в базе данных, а newAreaItem не является одним из них.
Ответ 2
У меня была та же самая проблема, что и у вас, когда newAreaItem == null
истинно.
Проблема возникает из-за того, что элемент, используемый в LINQ, не может быть нулевым. Таким образом, когда newAreaItem == null
истинно, это означает, что newAreaItem
имеет значение null, и это приводит к ошибке.
Все, что вы можете сделать, по моему мнению, - после проверки newAreaItem == null
установить newAreaItem на новый пустой объект этого типа, если newAreaIteam
равно null. Условие newAreaItemIsNull
все еще будет на месте, поэтому
(cm.AreaItem != null && cm.AreaItem.Id == newAreaItem.Id)
в вашем коде ниже не будет оцениваться, если newAreaItem
имеет значение null.
context.CharacteristicMeasures.
FirstOrDefault(cm => cm.Charge == null &&
cm.Characteristic != null && cm.Characteristic.Id == c.Id &&
cm.Line != null && cm.Line.Id == newLine.Id &&
cm.ShiftIndex != null && cm.ShiftIndex.Id == actShiftIndex.Id &&
(newAreaItem == null ||
(cm.AreaItem != null && cm.AreaItem.Id == newAreaItem.Id)));