JuHwon
JuHwon

Reputation: 2063

EF Non-static method requires a target

I've serious problems with the following query.

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

I get a TargetException: Non-static method requires a target when newAreaItem is null. If newAreaItem is not null I get an NotSupportedException: Unable to create a constant value of type 'PQS.Model.AreaItem'. Only primitive types or enumeration types are supported in this context.

Things I've already checked if they're null: c, newLine, actShiftIndex all 3 variables are not null and the Id is accessible.

I dont get it... please help.

If u need more information.. dont hesitate to ask...

UPDATE

I could eliminate the NotSupportedException, but I still got the TargetException when my newAreaItemIsNull is true.. :/

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

I finally did it. It seems that the query parse can't parse my newAreaItem(IsNull) because it's not in the DB model somehow !? I have to split my queries..

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

Does someone know a better solution?

Upvotes: 15

Views: 45238

Answers (2)

CristisS
CristisS

Reputation: 1163

I had the exact same problem as you have when newAreaItem == null is true.

The problem comes from the fact that the item used in the LINQ cannot be null. Thus, when newAreaItem == null is true it means that newAreaItem is null and this leads to the error being thrown.

All you can do in my opinion is, after checking newAreaItem == null, to set the newAreaItem to a new empty object of that type if newAreaIteam is null. The newAreaItemIsNull condition will still be in place, thus the

(cm.AreaItem != null && cm.AreaItem.Id == newAreaItem.Id)

in your code below will still not be evaluated if newAreaItem is 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)));

Upvotes: 0

alex
alex

Reputation: 12654

Try moving newAreaItem == null outside of the query

bool newAreaItemIsNull = (newAreaItem == null);

and replace newAreaItem == null with newAreaItemIsNull in query.

Query parser can only operate with the objects in the database, and newAreaItem is not one of them.

Upvotes: 18

Related Questions