0

如果我有以下查询在哪里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在原始列表中轻松替换?

4

1 回答 1

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);
}
于 2013-05-21T06:22:40.163 回答