LINQ To Entities e o método Contains, um contorno
Olá a todos,
Depois de muito tempo, volto a escrever. Tem sido uma dura correria que me impossibilitou de dar atenção a este valioso espaço. Porém, mais uma vez, prometo tentar reservar um pouco do meu tempo para enriquecer o conteúdo desta página.
Volto hoje com um assunto que não costumo discutir aqui no blog, que é codificação.
Ultimamente tenho ocupado quase que todo o meu tempo com estudos e discussões sobre a melhor forma de codificar algo. Um problema que encontrei dias atrás foi uma limitação do LINQ To Entities, que não implementou um método mapeado para a função “IN” do SQL. Um exemplo: quero obter todos os usuários do banco cujo ID é um dos números da sequência mística do seriado LOST, que é: 4, 8, 15, 16, 23, 42. A query SQL seria:
SELECT * FROM USER U WHERE U.ID IN (4, 8, 15, 16, 23, 42)
Em tese, uma expressão LINQ para fazer a mesma coisa seria mais ou menos assim:
string[] ids = { “4″, “8″, “15″, “16″, “23″, “42″ };
var users = (from t in _db.User where ids.Contains(t.Id.ToString()) select t).ToList();
Em tempo de compilação, tudo certo. Porém, ao executar este código, você receberá esta mensagem de erro:
LINQ to Entities does not recognize the method 'Boolean Contains(Int32)'
É possível estender as bibliotecas do LINQ para mapear a função, criar uma função ultra-complicada para fazer isso, mas há uma maneira de resolver com uma linha de código, que é:
var users = _db.User.Where("it.Id IN {" + string.Join(",", ids) + "}");
Atenção para a palavra chave “it”, ela representa sua entidade na query. Logo, Id é a propriedade.
Experimente!
[]‘s
Ricardo Serradas
