Подтвердить что ты не робот

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);

Кто-нибудь знает лучшее решение?

4b9b3361

Ответ 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)));