Function to include and exclude items according to table

0

I have this function:

 foreach (var item in obj.valores)
        {
            var ver = db.ProdutosFornecedores.Where(r => r.ProdutoID == item.ProdutoID && r.FornecedorID == item.FornecedorID).Select(r => r.Id).Single();
            if (ver == 0)
            {
                ProdutosFornecedores a = new ProdutosFornecedores();
                a.FornecedorID = item.FornecedorID;
                a.ProdutoID = item.ProdutoID;
                db.Add(a);
                db.SaveChanges();
            }
        }
        return Json(new { resultado = 1 });

It gets the data from the table, and includes in the database, correctly, however I want it to check with the database data. Example, the database has id 1 and 2, and I'm including 2 and 4, so I need it to delete the 1, continue the 2, and include the 4. I thought of deleting all and adding again, but I think it's something unnecessary, it's just a matter of dealing, I just can not think of the best way to do this, because after the result is done submit .

I came up with these data:

foreach (var item in obj.valores)
            {
                var listaAtual = db.ProdutosFornecedores.Where(r => r.ProdutoID == item.ProdutoID).Select(r => r.FornecedorID).ToList();
                var novaLista = obj.valores.Select(a => a.FornecedorID).ToList();
                var remover = listaAtual.Where(a => !novaLista.Contains(a));
                var adicionar = novaLista.Where(a => !listaAtual.Contains(a));
                foreach (var c in remover)
                {
                    var remove = db.ProdutosFornecedores.Single(d => d.ProdutoID == item.ProdutoID && d.FornecedorID == c);
                    if (remove != null)
                    {
                        db.ProdutosFornecedores.Remove(remove);
                        db.SaveChanges();
                    }
                }
                foreach (var c in adicionar)
                {
                    ProdutosFornecedores a = new ProdutosFornecedores();
                    a.FornecedorID = c;
                    a.ProdutoID = item.ProdutoID;
                    db.Add(a);
                    db.SaveChanges();
                }
            }

But it's not working the right way, what's being done wrong? If the id = 1 already exists, and in the table I include id = 2, it excludes 1 and includes only 2, I need to stay 1, and include 2.

    
asked by anonymous 02.10.2018 / 22:45

1 answer

1

Well I would do the following. Compare the two lists to know what to remove and what to add. see the example:

void Main()
{
    var listaAtual = new List<int>{ 1, 2, 3, 4, 5, 6};
    var novaLista = new List<int>{ 1, 2, 4,6,7};
    var remover = listaAtual.Where(a => !novaLista.Contains(a)).Select(a => a);
    var adicionar = novaLista.Where(a => !listaAtual.Contains(a)).Select(a => a);
    foreach(var c in remover){
        Console.WriteLine(c);
    }
    Console.WriteLine("===");
    foreach (var c in adicionar)
    {
        Console.WriteLine(c);
    }
}
Resultado:
3
5
===
7
    
03.10.2018 / 01:04