C#查询-非静态方法需要一个目标

C#查询-非静态方法需要一个目标,c#,entity-framework,linq,C#,Entity Framework,Linq,我得到一个错误,说“非静态方法需要一个目标” 这是导致我出错的代码,有人能解释一下吗 //TODO: Error, Non static method requires a target. var orderItem = _context.PurchaseOrderItems.FirstOrDefault( p => p.JobReference == item.JobReference && p.ItemNumber == item.ItemNum

我得到一个错误,说“非静态方法需要一个目标”

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

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

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

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

var orderItem = _context.PurchaseOrderItems.FirstOrDefault(
                p => p.JobReference == item.JobReference && p.ItemNumber == item.ItemNumber);
由于
orderItem.Id
orderItem
为空时抛出
NullReferenceException
,因此它将传播到LINQ抛出
TargetException
,如上文所述(有关更多信息,请参阅和)

因此,您需要通过将第二个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();
}

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