通常,人们这样做是为了返回与列表匹配的数据集:
然而,当使用Always Encrypted加密SSN列时,会出现以下错误:
string[] ssn = { "123456789", "987654321" };
var result_set = db.employee.Where(w => ssn.Contains(w.SSN)).ToList();
然而,当使用Always Encrypted加密SSN列时,会出现以下错误:
SqlException:数据类型为varchar(9)的加密数据, (encryption_type ='DETERMINISTIC',encryption_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_BIN2'与varchar在等于操作符中不兼容。
一般来说设置都是正确的,因为一个单一的值可以工作:
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相关,不一定涉及始终加密)其中有一些花哨的扩展程序创建了许多“or”条件。我还知道使用表变量可以在存储过程中进行一些巧妙的处理。但我真的正在寻找一种优雅的方式来完成这个任务,最好是通过LINQ,但至少也要在客户端代码中实现。我现在正处于确定始终加密是否会对新项目带来任何无法克服的障碍的阶段,因此我非常乐意听取建议。