0

Can someone explain how to conditionally delete objects from an EF result set?

Here is my code

var newClubKitOrders = from q in db.NewClubKitOrders where q.NewClubId == ncbId select q;
if (newClubKitOrders.Any())
{
    foreach (NewClubKitOrder order in newClubKitOrders)
    {
        if (checkedStatus == true)
        {
            order.OrderDate = DateTime.Now;
        }
        else
        {
            //delete the row (order.delete())
        }
    }

   newClubKitOrders.SaveChanges();
}

Thanks

Rashmin Javiya
  • 5,173
  • 3
  • 27
  • 49
Slinky
  • 5,662
  • 14
  • 76
  • 130

4 Answers4

4

You can't delete 'order' in “foreach” loop. So try “for” loop.

Arik
  • 180
  • 2
  • 9
  • This seems to not cause any warnings inside foreach() in VS but not sure if it actually deletes yet: var success = newClubKitOrders.Remove(order); – Slinky Jun 13 '14 at 18:05
  • @Slinky It'll compile, but when you go to run it it'll complain that the enumeration had changed. – sab669 Jun 13 '14 at 20:18
0

Use DeleteObject

Like this:

        else
        {
           newClubKitOrders.DeleteObject(order);
        }

Here is a good SO on some other options and how it all works.

Edit: Also yes, use a for loop, I didn't notice what you were iterating over. Thanks Rashmin Javiya!

Community
  • 1
  • 1
TheNorthWes
  • 2,661
  • 19
  • 35
0

Try following code, i have copied list in another list to be on safe side. temp list is just to traverse but actual transaction take place on original list

var newClubKitOrders = from q in db.NewClubKitOrders where q.NewClubId == ncbId select q;

if (newClubKitOrders.Any())
{
    var TempnewClubKitOrders = newClubKitOrders.ToList();

    for(int i=0; i< TempnewClubKitOrders.Length; i++)
    {
        if (checkedStatus == true)
        {
            newClubKitOrders[i].OrderDate = DateTime.Now;
        }
        else
        {
            db.NewClubKitOrde.DeleteObject(newClubKitOrders[i]);
        }
    }

   db.SaveChanges();
}
Rashmin Javiya
  • 5,173
  • 3
  • 27
  • 49
  • Error: "Cannot apply indexing to linq expression.." I guess I cannot use array indexer for some reason - seems odd since it was converted to a list – Slinky Jun 13 '14 at 18:15
0

this should work:

var newClubKitOrders = from q in db.NewClubKitOrders where q.NewClubId == ncbId select q;

if (newClubKitOrders.Any())
{
    foreach (NewClubKitOrder order in newClubKitOrders)
    {
        if (checkedStatus == true)
        {
            order.OrderDate = DateTime.Now;
        }
        else
        {
            db.NewClubKitOrders.Remove(order);
        }
    }

    db.SaveChanges();
}