在LINQ查询上执行解密功能

时间:2013-05-21 05:50:19

标签: c# asp.net linq entity-framework sqlclr

如果我有Companies.Name加密的以下查询:

显然执行以下查询将无效,因为我们正在搜索加密名称。

IQueryable<File> files = GetFiles(f => f.Clients.Any(fc => fc.Contacts.Any(c => c.Companies.Any(x => x.Name.Contains(searchText)))));

我正在通过我们已有的Companies.Name函数执行查询之前解密Decrypt()的方法。

编辑1:

我有一个部分类Company,其中包含一个名为DisplayName的解密属性,它返回解密的Name属性,但是LINQ告诉我指定的类型成员DisplayName是LINQ to Entities不支持。仅支持初始化程序,实体成员和实体导航属性。

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

1 个答案:

答案 0 :(得分:0)

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

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