如果我有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
?
答案 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);
}