У меня есть функция, в которой я получаю список идентификаторов, и мне нужно вернуть список, соответствующий описанию, связанному с идентификатором. Например:
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
}
Поэтому, если бы я сам создавал sql для этого, я бы просто сделал что-то вроде следующего (где предложение in содержит все значения в аргументе codeIds):
Select CodeId, Description FROM CodeTable WHERE CodeId IN ('1a','2b','3')
В Linq to Sql я не могу найти эквивалент предложения «IN». Лучшее, что я нашел до сих пор (что не работает):
var foo = from codeData in channel.AsQueryable<CodeData>()
where codeData.CodeId == "1" || codeData.CodeId == "2"
select codeData;
Проблема в том, что я не могу динамически генерировать список предложений «ИЛИ» для linq to sql, потому что они устанавливаются во время компиляции.
Как выполнить предложение where, которое проверяет наличие столбца в динамическом списке значений с помощью Linq to Sql?
источник
codeIDs
будетList<int>
, и все будет хорошо.Вы также можете использовать:
источник
Я использовал метод в ответе Джона Скита, но мне пришло в голову другое использование
Concat
. ЭтотConcat
метод показал себя немного лучше в ограниченном тесте, но это хлопотно, и я, вероятно, просто буду придерживаться егоContains
или, может быть, я напишу вспомогательный метод, чтобы сделать это за меня. В любом случае, вот еще один вариант, если кому-то интересно:Метод
Тест производительности
Это не было даже отдаленно научным. Я полагаю, что ваша структура базы данных и количество идентификаторов, включенных в список, окажут значительное влияние.
Я установил тест, в котором я провел по 100 испытаний каждое,
Concat
иContains
каждое испытание включало выбор 25 строк, заданных рандомизированным списком первичных ключей. Я запускал это около дюжины раз, и в большинстве случаевConcat
метод работает на 5-10% быстрее, хотя один разContains
метод выигрывал совсем немного.источник
источник
Вот как я это делаю с помощью HashSet
HashSet в основном почти равен O (1), поэтому ваша сложность остается O (n).
источник