对LINQ查询执行解密函数
本文关键字:解密 函数 执行 查询 LINQ | 更新日期: 2023-09-27 18:14:26
如果我有以下查询,其中Companies.Name
是加密的:
显然,执行下面的查询将是无效的,因为我们搜索的是加密的名称。
IQueryable<File> files = GetFiles(f => f.Clients.Any(fc => fc.Contacts.Any(c => c.Companies.Any(x => x.Name.Contains(searchText)))));
我在通过我们已经存在的Decrypt()
函数执行查询之前解密Companies.Name
的方法。
编辑1:
我确实有一个部分类Company
,它具有一个称为DisplayName
的解密属性,返回解密的Name
属性,但是LINQ告诉我指定的类型成员DisplayName
在LINQ到实体中不支持。只支持初始化式、实体成员和实体导航属性。
IQueryable<File> files = GetFiles(f => f.Clients.Any(fc => fc.Contacts.Any(c => c.Companies.Any(x => x.DisplayName.Contains(searchText)))));
如果有办法在LINQ语句中使用部分类属性,我想它会工作的。
编辑2:
我最终创建了一个SQL CLR函数来解密公司名称,现在我可以在代码中调用dataContext.SearchCompanies(searchText)
来返回Companies
的列表。
我不确定,然而,如何在原始列表中轻松替换Companies
?
可以定义一个存储过程来执行搜索:
create procedure SearchCompanies @searchText nvarchar(100)
as begin
select * from Companies c -- Implement your logic here...
where dbo.Decrypt(c.Name) like @searchText
end
然后,将存储过程作为函数导入添加到数据上下文中,并获取数据:
using(var dataContext = new DataContext())
{
return dataContext.SearchCompanies(searchText);
}