EF非静态方法需要目标

时间:2013-03-19 12:02:29

标签: c# linq entity-framework

我对以下查询存在严重问题。

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

当newAreaItem为null时,我得到TargetException: Non-static method requires a target。 如果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个变量都不为空,并且可以访问Id。

我不明白......请帮助。

如果您需要更多信息,请不要犹豫......

更新

我可以消除NotSupportedException,但是当newAreaItemIsNull为true时,我仍然得到了TargetException ..:/

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

更新

我终于做到了。似乎查询解析无法解析我的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);

有人知道更好的解决方案吗?

2 个答案:

答案 0 :(得分:17)

尝试在查询之外移动newAreaItem == null

bool newAreaItemIsNull = (newAreaItem == null);

并在查询中将newAreaItem == null替换为newAreaItemIsNull

查询解析器只能与数据库中的对象一起使用,而newAreaItem不是其中之一。

答案 1 :(得分:0)

我遇到与newAreaItem == null为真时完全相同的问题。

问题来自LINQ中使用的项不能为空的事实。因此,当newAreaItem == null为真时,意味着newAreaItem为空,这会导致错误被抛出。

我认为,在检查newAreaItem == null之后,如果newAreaIteam为空,则将newAreaItem设置为该类型的新空对象。 <{1}}条件仍然存在,因此

newAreaItemIsNull
如果(cm.AreaItem != null && cm.AreaItem.Id == newAreaItem.Id) 为空,则仍然不会评估下面代码中的

newAreaItem