Mam funkcję, w której otrzymuję listę identyfikatorów i muszę zwrócić listę pasującą do opisu, który jest powiązany z identyfikatorem. Na przykład:
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
}
Więc gdybym sam tworzył sql dla tego, po prostu zrobiłbym coś podobnego do następującego (gdzie klauzula in zawiera wszystkie wartości w argumencie codeIds):
Select CodeId, Description FROM CodeTable WHERE CodeId IN ('1a','2b','3')
W Linq do Sql nie mogę znaleźć odpowiednika klauzuli „IN”. Najlepsze, jakie do tej pory znalazłem (które nie działa) to:
var foo = from codeData in channel.AsQueryable<CodeData>()
where codeData.CodeId == "1" || codeData.CodeId == "2"
select codeData;
Problem polega na tym, że nie mogę dynamicznie wygenerować listy klauzul „OR” dla linq do sql, ponieważ są one ustawiane w czasie kompilacji.
Jak można osiągnąć klauzulę WHERE, która sprawdza, czy kolumna znajduje się na dynamicznej liście wartości przy użyciu Linq do Sql?
źródło
codeIDs
byłobyList<int>
i wszystko byłoby w porządku.Możesz również użyć:
źródło
Używałem metody w odpowiedzi Jona Skeeta, ale przyszła mi do głowy inna metoda
Concat
.Concat
Metoda wykonywana nieco lepiej w ograniczonej próbie, ale jest to uciążliwe i będę prawdopodobnie tylko trzymaćContains
, a może będę napisać metodę pomocniczą, aby to zrobić dla mnie. Tak czy inaczej, oto inna opcja, jeśli ktoś jest zainteresowany:Metoda
Test wydajności
To nie było ani trochę naukowe. Wyobrażam sobie, że struktura bazy danych i liczba identyfikatorów znajdujących się na liście miałyby znaczący wpływ.
Skonfigurowałem test, w którym wykonałem 100 prób,
Concat
aContains
każda próba obejmowała wybranie 25 wierszy określonych przez losową listę kluczy podstawowych. Uruchamiałem to kilkanaście razy i w większości przypadkówConcat
metoda wychodzi 5 - 10% szybciej, chociaż razContains
wygrywała tylko odrobinę.źródło
źródło
Oto jak to robię za pomocą HashSet
HashSet jest w zasadzie prawie do O (1), więc twoja złożoność pozostaje O (n).
źródło