C# EntityFramework在声明和使用变量之前是否监视变量?
当我使用Linq时,我无法理解发生了什么。任何检查对象是否包含特定值的方法,代码都会在使用前对带有数据的变量抛出NullReferenceException 代码如下:C# EntityFramework在声明和使用变量之前是否监视变量?,c#,linq,entity-framework,entity-framework-6,linq-to-objects,C#,Linq,Entity Framework,Entity Framework 6,Linq To Objects,当我使用Linq时,我无法理解发生了什么。任何检查对象是否包含特定值的方法,代码都会在使用前对带有数据的变量抛出NullReferenceException 代码如下: public ML.Order FetchOrder(ML.MLDBContext db, long OrderID) { if (db == null) db = new ML.MLDBContext();
public ML.Order FetchOrder(ML.MLDBContext db, long OrderID)
{
if (db == null)
db = new ML.MLDBContext();
//avoided code to fetch the Order details from another system via API
Order apiOrder = api.OrdersGet(OrderID);
//avoided code to test null results
bool isNew = false; //to check if fetched order is new or must be updated on DB
//load from DB
ML.Order dbOrder = db.Orders.Where(o => o.OrderID == apiOrder.id).FirstOrDefault();
if (dbOrder == null)
{
isNew = true;
//avoided code to fill dbOrder with apiOrder data
//Below code check if user bought the same product before
//the error is thrown here but it's not null
string ListingID = apiOrder.order_items.First().item.id;
var previousOrders = db.Orders.Where(order => order.OrderID != apiOrder.id && order.CustomerID == apiOrder.buyer.id && order.SellerID == apiOrder.seller.id).ToList();
foreach (ML.Order prevOrder in previousOrders)
{
if (prevOrder.OrderedItems.Any(i => i.ListingID == ListingID)) //Line who causes the error
{
//code to mask as reordered item
}
}
有几点:
我确信apiOrder.order\u items.First.item.id始终具有任何值
我确信订单包含我要查找的项目,并且字段不可为空
当我注释导致错误的行时,调试将顺利通过
为了解决这个问题,我不得不用foreach替换Linq.Any
我的疑问是:
Linq.Any或EntityFramework在声明和使用变量之前是否监视变量
为什么在使用变量之前对其执行NullreferenceException
使用Linq有什么问题?有没有方法检查EF对象中是否存在值?当prevOrder.OrderedItems为空时会发生什么?你的例外发生了。。。因此,如果prevOrder.OrderedItems!=null&&prevOrder.OrderedItems.Anyi=>…可能的@entropic prevOrder.OrderedItems副本将永远不会为null,我只使用Itens创建订单,在这种情况下,OrderedItems不是null或空的,它的值计数始终为1@paqogomez不是同一个问题,我在你的笔记说错误发生在if行之前检查了这个!?!?!我们又来了。订单是否为空?订单项是否为空?First.Item是否为空?ListingID返回空值吗?其中一个是空的。它不是EF,也不是任何
foreach (ML.Order prevOrder in previousOrders)
{
foreach (ML.OrderedItem item in prevOrder.OrderedItems)
{
if (item.ListingID == ListingID)
{
//code to mask as reordered item
}
}
}