web-dev-qa-db-fra.com

EF La méthode non statique nécessite une cible

J'ai de sérieux problèmes avec la requête suivante.

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

Je reçois un TargetException: Non-static method requires a target lorsque newAreaItem est null . Si newAreaItem n'est pas null, je reçois un NotSupportedException: Unable to create a constant value of type 'PQS.Model.AreaItem'. Only primitive types or enumeration types are supported in this context.

Les choses que j'ai déjà vérifiées si elles sont nulles: C, newLine, actShiftIndex, les 3 variables ne sont pas nulles et l'ID est accessible. 

Je ne comprends pas ... s'il vous plaît, aidez-moi.

Si vous avez besoin de plus d'informations .. n'hésitez pas à demander ...

METTRE À JOUR

Je pourrais éliminer la NotSupportedException, mais j'ai quand même eu la TargetException quand mon newAreaItemIsNull est 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)));

METTRE À JOUR

Je l'ai finalement fait. Il semble que l'analyse de la requête ne puisse pas analyser ma newAreaItem(IsNull) car elle ne fait pas partie du modèle de base de données!? Je dois diviser mes requêtes .. 

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

Est-ce que quelqu'un connaît une meilleure solution?

11
JuHwon

Essayez de déplacer newAreaItem == null en dehors de la requête

bool newAreaItemIsNull = (newAreaItem == null);

et remplacez newAreaItem == null par newAreaItemIsNull dans la requête.

L'analyseur de requêtes ne peut fonctionner qu'avec les objets de la base de données, et newAreaItem n'en fait pas partie.

16
alex

J'ai eu exactement le même problème que lorsque newAreaItem == null est vrai.

Le problème vient du fait que l'élément utilisé dans le LINQ ne peut pas être null. Ainsi, lorsque newAreaItem == null est vrai, cela signifie que newAreaItem est null et que l'erreur est renvoyée.

Tout ce que vous pouvez faire à mon avis est, après avoir vérifié newAreaItem == null, de définir newAreaItem sur un nouvel objet vide de ce type si newAreaIteam est null La condition newAreaItemIsNull sera toujours en place, ainsi la 

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

dans votre code ci-dessous ne seront toujours pas évalués si newAreaItem est 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)));
0
CristisS