locked
Como fazer um "Not In" no Linq RRS feed

  • Pergunta

  • Gente como faço um select que tenha "Not In" no Linq? Gostaria de fazer um select como esse:

    select cd_pedido from pedido where cd_pedido not in (select cd_pedido from itens_pedido)


    Ercília

    quinta-feira, 12 de julho de 2012 19:50

Respostas

  • Podes usar o Contains no caso de ser uma igualdade directa, por exemplo:

    var items1 = new string[] { "a", "b", "c", "d", "e" };
    var items2 = new string[] { "b", "d" };
    
    var result = items1.Where(x => !items2.Contains(x));
    
    foreach (var item in result)
    {
        Console.WriteLine(item);
    }

    O resultado será "a", "c" e "e"

    No caso de teres que fazer algum tipo de transformação ou não se tratar de uma igualdade directa, o Any será outra solução:

    var items1 = new string[] { "a", "b", "c", "d", "e" };
    var items2 = new string[] { "b", "d" };
    
    var result = items1.Where(x => !items2.Any(y => x == y));
    
    foreach (var item in result)
    {
        Console.WriteLine(item);
    }

    Como podes ver, aqui estou a forçar o tipo de igualdade a realizar (mas que acaba por ser os mesmo resultados do primeiro exemplo!)


    Pedro Lamas
    DevScope | Senior Software Development Engineer & WP7 Development Speaker
    www.pedrolamas.com | @pedrolamas

    • Marcado como Resposta Ercília segunda-feira, 16 de julho de 2012 20:22
    quinta-feira, 12 de julho de 2012 22:32

Todas as Respostas

  • Podes usar o Contains no caso de ser uma igualdade directa, por exemplo:

    var items1 = new string[] { "a", "b", "c", "d", "e" };
    var items2 = new string[] { "b", "d" };
    
    var result = items1.Where(x => !items2.Contains(x));
    
    foreach (var item in result)
    {
        Console.WriteLine(item);
    }

    O resultado será "a", "c" e "e"

    No caso de teres que fazer algum tipo de transformação ou não se tratar de uma igualdade directa, o Any será outra solução:

    var items1 = new string[] { "a", "b", "c", "d", "e" };
    var items2 = new string[] { "b", "d" };
    
    var result = items1.Where(x => !items2.Any(y => x == y));
    
    foreach (var item in result)
    {
        Console.WriteLine(item);
    }

    Como podes ver, aqui estou a forçar o tipo de igualdade a realizar (mas que acaba por ser os mesmo resultados do primeiro exemplo!)


    Pedro Lamas
    DevScope | Senior Software Development Engineer & WP7 Development Speaker
    www.pedrolamas.com | @pedrolamas

    • Marcado como Resposta Ercília segunda-feira, 16 de julho de 2012 20:22
    quinta-feira, 12 de julho de 2012 22:32
  • Então seria dessa forma: "var query = ctx.PEDIDOs.Where(p => !ctx.ITENS_PEDIDOs.Contains(p));". Só que assim está dando erro, qual o problema nesse código?

    Ercília

    segunda-feira, 16 de julho de 2012 13:47
  • No teu caso o Contains não deve ser possível de aplicar, dado que me leva a crer que PEDIDOs é de um tipo de dados, e ITENS_PEDIDOs é de outro tipo; neste caso utilizaria a abordagem do Any e comparava as chaves (ID's) ou algo do género!

    Pedro Lamas
    DevScope | Senior Software Development Engineer & WP7 Development Speaker
    www.pedrolamas.com | @pedrolamas

    segunda-feira, 16 de julho de 2012 15:45