15

我对以下查询有严重问题。

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

TargetException: Non-static method requires a target 当 newAreaItem 为空时,我得到一个。如果 newAreaItem 不为空,我会得到一个NotSupportedException: Unable to create a constant value of type 'PQS.Model.AreaItem'. Only primitive types or enumeration types are supported in this context.

我已经检查过它们是否为空:c、newLine、actShiftIndex 所有 3 个变量都不为空,并且 Id 是可访问的。

我不明白...请帮助。

如果你需要更多信息..不要犹豫问...

更新

我可以消除NotSupportedException,但是当我的 newAreaItemIsNull 为真时,我仍然得到 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);

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

4

2 回答 2

18

尝试移出newAreaItem == null查询

bool newAreaItemIsNull = (newAreaItem == null);

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

查询解析器只能对数据库中的对象进行操作,newAreaItem 不是其中之一。

于 2013-03-19T12:14:26.000 回答
0

newAreaItem == null当是真的时,我遇到了与您完全相同的问题。

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

在我看来,您所能做的就是在检查newAreaItem == null后将 newAreaItem 设置为该类型的新空对象(如果newAreaIteam为空)。newAreaItemIsNull条件仍然存在,因此

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

newAreaItem如果为空,则在您下面的代码中仍然不会被评估。

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)));
于 2013-12-05T08:29:51.463 回答