Linq Compare two lists of different types

4

I have two different lists A List<ProdutoTag> and B = List<Tag> :

public class ProdutoTag
{
    public Int64 ProdutoId { get; set; }
    public Int32 TagId { get; set; }
    public Double Peso { get; set; }
    public virtual Tag Tag { get; set; }
    public virtual Produto Produto { get; set; }
}

public class Tag
{
    public Int32 TagId { get; set; }
    public String Descricao { get; set; }

    public virtual ICollection<ProdutoTag> ProdutosTags { get; set; }
    public virtual ICollection<Resposta> Respostas { get; set; }        
}

I need to check if list A contains all elements of list B (If list A has other elements that list B does not have, pipe well, but list A must have all elements of list B) .

The way to compare the two lists is through property A.

It would look something like (where x.ProductsTags is my list A):

// Busco na base de dados todos os produtos
var produtos = _context.Produtos.ToList();
// Agora preciso apenas dos produtos que contenham todas as tags selecionadas
var selecionados = produtos.Where(x => x.ProdutosTags.Contains(B));

How can I compare two lists of different types?

    
asked by anonymous 23.02.2016 / 18:38

1 answer

8

So:

var aContemB = !b.Except(a.Select(p => p.Tag).ToList()).Any();

That is, it checks if any item of B is an exception against A, and verifies that the result has elements.

If there are any errors, try to materialize the two lists before the comparison, ie:

var listaA = a.Select(p => p.Tag).ToList();
var listaB = b.ToList(); // Isto garante que todos os SQL foram executados antes da comparação.
var aContemB = !listaB.Except(listaA).Any();
    
23.02.2016 / 18:42