【问题标题】:C# Query - Non Static Method Requires a TargetC# 查询 - 非静态方法需要一个目标
【发布时间】:2017-05-08 08:07:56
【问题描述】:

我收到一条错误消息,提示“非静态方法需要一个目标”

这是导致我出现错误的代码,有人能解释一下吗?

//TODO: Error, Non static method requires a target.
var orderItem =
    _context.PurchaseOrderItems.FirstOrDefault(
        p => p.JobReference == item.JobReference && p.ItemNumber == item.ItemNumber);
return _context.DeliverySchedules.Include(d => d.PurchaseOrderItem)
           .Where(d => d.PurchaseOrderItem.Id == orderItem.Id)
               .ToList();

【问题讨论】:

  • EntityFramework.SqlServer.dll 中发生“System.Reflection.TargetException”类型的异常,但未在用户代码中处理附加信息:非静态方法需要目标。
  • .Where(d => d.PurchaseOrderItem.Id == orderItem.Id) 如果orderItem 从第一个查询返回 null 或没有结果,则可能会抛出 NRE。在使用 if (orderItem != null) 返回另一个查询之前尝试测试空条件。
  • FirstOrDefault 更改为Single,因为在下一行中您将获得它的属性并且您不想要 NullReferenceException。

标签: c# entity-framework linq


【解决方案1】:

如果没有返回查询结果,FirstOrDefault 方法可能会返回空值:

var orderItem = _context.PurchaseOrderItems.FirstOrDefault(
                p => p.JobReference == item.JobReference && p.ItemNumber == item.ItemNumber);

由于当orderItem 为空时orderItem.Id 抛出NullReferenceException,它将传播到LINQ 抛出TargetException,如问题所述(有关更多信息,请参阅this postthis post)。

因此,您需要通过将第二个 LINQ 查询修改为这个来检查 orderItem 是否存在空值:

return _context.DeliverySchedules.Include(d => d.PurchaseOrderItem)
       .Where(d => (orderItem != null && d.PurchaseOrderItem.Id == orderItem.Id))
       .ToList();

注意:在检索 orderItem 的属性 Id 之前必须进行空值检查,以防止 NullReferenceException

作为替代方案,可以使用if 条件来检查空值,而无需修改第二个查询:

if (orderItem != null)
{
    return _context.DeliverySchedules.Include(d => d.PurchaseOrderItem)
           .Where(d => d.PurchaseOrderItem.Id == orderItem.Id)
           .ToList();
}

【讨论】:

    【解决方案2】:

    FirstOrDefault 更改为Single,因为在下一行中您将获得它的属性并且您不想要NullReferenceException

    【讨论】:

      猜你喜欢
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多