LINQ – Any() x Contains()

<Post atualizado (em vermelho abaixo) com a contribuição do Rodrigo Vidal e Abner das Dores.>

Existem dois tipos de developer: os que apenas querem fazer funcionar e os que querem entender o que estão fazendo para fazer funcionar direito (leia-se bem feito).

Se você é o segundo, provavelmente já se questionou em algum momento quando se usa Any() ou Contains() nas consultas com LINQ. É claro que a resposta é: depende! (hehe). Em grande parte dos casos o resultado será o mesmo e o comportamento semelhante.

Só para recaptular:

Contains() é um método e o seu desempenho depende muito do próprio uso. Em um List tem complexidade O(n), enquanto em um HashSet seria O(1).

Any() é um método de extensão, é mais flexível. Podemos aplicar uma lambda/delegate. Isto teria uma complexidade de O(n).

Vale lembrar que Contains() também possui um método de extensão IEnumerable<T>, que pensando bem, possui uma instância em quase todas coleções.

Se você for fazer algum benchmark, verá que em grande parte das vezes o Any() é um pouco mais lento que Contains() porque não precisa invocar um delegate para cada elemento, ele utiliza a instância Equals. (apenas e se o tipo T não implementa a interface IEquatable<T>) Mas no final das contas se você olhar para a complexidade uma a uma, esta performance será quase a mesma. Agora acho que deu pra entender o porque da resposta “depende”.  =)

Se ainda não deu pra entender, veja bem:

Any()
Determina se qualquer elemento de uma seqüência satisfaz uma condição.
IEnumerable.Any(Extension method)
colecao.Any(i => i == 1);

Contains()
Determina se um elemento está em uma coleção.
IEnumerable.Contains(Object Method)
colecao.Contains(1);

E ainda também temos o Exists(), que não falamos aqui. Ele determina se a List(T) contém elementos que atendam às condições definidas por uma condição.
List.Exists (Object method)

Mas nem tudo são flores.
Usando Contains() com Entity Framework/NHibernate a saída SQL será transcrita para a clausula “WHERE IN”. E aí que mora o perigo, pois isto afeta o desempenho da aplicação, além do problema de alguns bancos como o Oracle que tem o limite de 1000 na clausula IN (ou seja, passou disso você tem 2 problemas).

Para o Entity Framework 6 o problema de performance utilizando Contains foi melhorado, quanto à clausula IN fique atento nos testes para atender o seu cenário e caso seja preciso um Join resolve.

Já passou por algo semelhante? Está usando o EF6? Mande seu feedback. =)
Abraço.

MVP Award, 7 anos consecutivos

Este é apenas um post de comemoração.
Pelo 7º ano consecutivo recebi o título de MVP da Microsoft e isto não me torna melhor do que ninguém, mas me torna mais motivado profissionalmente e ainda mais motivado em estar engajado dentro da comunidade técnica fazendo o que fiz nestes últimos 12 anos.

Abaixo um pedaço do sonhado e-mail…

Abaixo o meu award ficando bem bonito a cada ano que passa. =)

 

Agora é aguardar o momento para retornar a Seattle no MVP Summit deste ano, que sem dúvida é um dos grandes benefícios de ser um MVP.

Estaremos em sinonia…
Abraço.

User Group Meeting – ASP.NET Identity

E retornamos os encontros técnicos!
Hoje, em pleno sábado de copa do mundo reunimos logo cedo para colocar em pauta o ASP.NET Identity, que por sinal ficou bastante flexível e sintético.

top.crop_1170x350_0,0

O código e os questionamentos levantados estão no GitHub do DevGoiás e caso você queira se juntar a nós, você pode participar e colaborar por lá também.

O slide é básico, focamos mais no código. De toda forma serve para referência. Está abaixo:

foto
Membros do grupo produzindo código. Produtivo.

Agradecimento aos sponsors desta reunião: GitHub, Apress, Microsoft, JetBrains e Not In California que gentilmente nos concedeu o espaço.

Se você quer participar do próximo encontro, fique ligado no meu twitter e no canal do DevGoiás no Facebook.

Até a próxima!

UPDATE 1

Na reunião surgiu uma dúvida da migração do Membership para o Identity. E no final da semana saiu um txt no projeto do Identity do Codeplex com as instruções e scripts para esta migração. Caso alguém teste esta migração deixe o feedback.

https://aspnet.codeplex.com/SourceControl/latest

VS14 CTP com template para o ASP.NET vNext

Ontem foi liberado o Community Technology Previews (CTP) do Visual Studio 14 que pode ser baixado clicando neste link. Lembrando que é um CTP, então não instale em produção.

Nesta versão já tem como você criar um projeto com ASP.NET vNext.

 

E se falando em ASP.NET vNext, já tem uma galerinha que está brincando com ele lá no Linux. Segue abaixo dois posts caso queira testar por lá:

Fazendo algo com o vNext? Deixa seu feedback.. =)