Eu tenho uma função onde obtenho uma lista de ids e preciso retornar a uma lista que corresponda a uma descrição associada ao id. Por exemplo:
public class CodeData
{
string CodeId {get; set;}
string Description {get; set;}
}
public List<CodeData> GetCodeDescriptionList(List<string> codeIDs)
//Given the list of institution codes, return a list of CodeData
//having the given CodeIds
}
Portanto, se eu estivesse criando o sql para isso, simplesmente faria algo como o seguinte (em que a cláusula in contém todos os valores no argumento codeIds):
Select CodeId, Description FROM CodeTable WHERE CodeId IN ('1a','2b','3')
No Linq to Sql, não consigo encontrar o equivalente da cláusula "IN". O melhor que encontrei até agora (que não funciona) é:
var foo = from codeData in channel.AsQueryable<CodeData>()
where codeData.CodeId == "1" || codeData.CodeId == "2"
select codeData;
O problema é que não consigo gerar dinamicamente uma lista de cláusulas "OR" de linq para sql, porque elas são definidas em tempo de compilação.
Como alguém realiza uma cláusula where que verifica se uma coluna está em uma lista dinâmica de valores usando Linq to Sql?
fonte
codeIDs
seria umList<int>
, e tudo ficaria bem.Você também pode usar:
fonte
Eu estava usando o método na resposta de Jon Skeet, mas outro me ocorreu usando
Concat
. OConcat
método funcionou um pouco melhor em um teste limitado, mas é um incômodo e provavelmente vou ficar comContains
, ou talvez escreva um método auxiliar para fazer isso por mim. De qualquer forma, aqui está outra opção se alguém estiver interessado:O método
Teste de performance
Isso não era nem remotamente científico. Imagino que sua estrutura de banco de dados e o número de IDs envolvidos na lista teriam um impacto significativo.
Eu configurei um teste em que fiz 100 tentativas cada
Concat
e emContains
que cada tentativa envolvia a seleção de 25 linhas especificadas por uma lista aleatória de chaves primárias. Eu executei isso cerca de uma dúzia de vezes, e na maioria das vezes oConcat
método sai 5 a 10% mais rápido, embora uma vez oContains
método tenha vencido por apenas um pouquinho.fonte
fonte
Aqui está como faço isso usando HashSet
HashSet é basicamente quase O (1), então sua complexidade permanece O (n).
fonte