Eu tenho uma lista contendo os IDs da minha UserProfile
tabela. Como posso selecionar tudo com UserProfiles
base na lista de IDs que obtive em um var
uso LINQ
?
var idList = new int[1, 2, 3, 4, 5];
var userProfiles = _dataContext.UserProfile.Where(......);
Fiquei preso aqui. Eu posso fazer isso usando loops, etc. Mas eu prefiro fazer isso LINQ
.
Respostas:
Você pode usar
Contains()
para isso. Isso parecerá um pouco atrasado quando você estiver realmente tentando produzir umaIN
cláusula, mas isso deve ser feito:Também estou assumindo que cada
UserProfile
registro terá umint
Id
campo. Se não for esse o caso, você precisará ajustar em conformidade.fonte
Contains()
lidará com essa verificação de igualdade em cadaid
valor, se você usá-lo como escrevi na resposta. Você não precisa escrever explicitamente em==
nenhum lugar ao tentar comparar os itens de um conjunto (a matriz) com outro (a tabela do banco de dados).A solução com .Where e .Contains possui complexidade de O (N quadrado). Simples. A junção deve ter um desempenho muito melhor (próximo a O (N) devido ao hash). Portanto, o código correto é:
E agora resultado da minha medição. Gerei 100 000 perfis de usuário e 100 000 IDs. A associação levou 32ms e .Aonde os .Contains levou 2 minutos e 19 segundos! Eu usei IEnumerable puro para este teste para provar minha afirmação. Se você usar Lista em vez de IEnumerable, .Where e .Contains serão mais rápidos. De qualquer forma, a diferença é significativa. O mais rápido. Onde. Contém é com Set <>. Tudo depende da complexidade das coletâneas subjacentes para .Contains. Veja este post para aprender sobre a complexidade do linq. Veja meu exemplo de teste abaixo:
Saída do console:
fonte
List
usado. 1Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.
erro ao usar o datacontext LINQ2SQL.Ótimas respostas, mas não se esqueça de uma coisa IMPORTANTE - elas fornecem resultados diferentes!
Isso retornará 2 linhas do banco de dados (e isso pode estar correto, se você quiser apenas uma lista classificada de usuários)
MAS, em muitos casos, você pode querer uma lista não classificada de resultados. Você sempre tem que pensar sobre isso como uma consulta SQL. Veja o exemplo no carrinho de compras da eshop para ilustrar o que está acontecendo:
Isso retornará 5 resultados do DB. Usar 'contém' estaria errado neste caso.
fonte
Isso deve ser simples. Tente o seguinte:
fonte