对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 ?

对LINQ查询执行解密函数

可以定义一个存储过程来执行搜索:

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);
}