Как правило, это нужно сделать, чтобы вернуть набор данных, соответствующий списку:
string[] ssn = { "123456789", "987654321" };
var result_set = db.employee.Where(w => ssn.Contains(w.SSN)).ToList();
Однако, когда столбец SSN зашифрован с помощью Always Encrypted, возникает эта ошибка:
SqlException: типы данных varchar(9), зашифрованные с помощью (encryption_type = 'DETERMINISTIC', шифрование_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_SSN', column_encryption_key_database_name = 'MyCompany') collation_name = 'Latin1_General_varchar2' и в операторе equal to несовместимы .
В целом все настроено правильно, потому что работает одно значение:
string ssn = "123456789";
var result_set = db.employee.Where(w => w.SSN == ssn).ToList();
Я ищу лучший способ сделать это на стороне клиента. Я знаю, что этот обходной путь работает, но для этого требуется, чтобы вся таблица перешла через провод:
var result_set = db.employee.ToList().Where(w => ssn.Contains(w.SSN));
Я видел несколько примеров (относящихся к более старой версии .NET, не обязательно в отношении Always Encrypted), где есть какое-то причудливое расширение, которое создает кучу «или». Я также знаю, что с табличными переменными я мог бы делать некоторые хитрые вещи с хранимой процедурой. Но я действительно ищу элегантный способ сделать это, желательно через LINQ, но, по крайней мере, в клиентском коде. Я нахожусь на этапе определения того, представляет ли Always Encryption какие-либо непреодолимые препятствия для нового проекта, поэтому я открыт для предложений.