Does EntityFramework Monitor variables prior to it's declaration and use?

198 Views Asked by At

I couldn't understand what was happening when I use Linq.Any() method to check if object contains a specific value, the code throws a NullReferenceException on variable with data prior it's use.

The code below:

        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
                    }
                }

Some points:

I'm sure "apiOrder.order_items.First().item.id" always have any value.

I'm sure the Order contains the item I'm looking for and the field isn't nullable.

When I comment the line who causes the error, the debug will pass through without errors

To solve this problem, I had to replace Linq.Any() by foreach

        foreach (ML.Order prevOrder in previousOrders)
        {
            foreach (ML.OrderedItem item in prevOrder.OrderedItems)
            {
                if (item.ListingID == ListingID)
                {
                     //code to mask as reordered item
                }
            }

        }

My doubt is: Does Linq.Any() or EntityFramework Monitor variables prior to it's declaration and use?

Why the NullreferenceException was trowed on variable prior it usage?

What's the problem using the Linq.Any() method to check the existence of a value inside EF object?

0

There are 0 best solutions below