我有一种情况,需要比较两个网址,一个进入方法,另一个进入数据库。数据库中的那个可能是或者可能不是Url解码的,并且将具有%20的空间等等。
这是方法中的linq查询:
var Result = (from s in context.301Redirects
where s.IsDeleted == false && s.Status == true && HttpUtility.UrlDecode(s.OldURL).ToUpper() == HttpUtility.UrlDecode(OldURLPath).ToUpper()
select s.NewURL).FirstOrDefault();
return Result;
在方法内部,我可以对传入的参数进行UrlDecode,但是db中的那个是什么? 这个失败,因为EF不会识别UrlDecode方法,抛出和异常这样说。
有解决方法吗?
答案 0 :(得分:2)
您可以将集合带入内存,然后通过评估查询来执行UrlDecode
。尝试:
var Result = (from s in context.301Redirects
where s.IsDeleted == false && s.Status == true)
.AsEnumerable()
.FirstOrDefault(HttpUtility.UrlDecode(s.OldURL).ToUpper() == HttpUtility.UrlDecode(OldURLPath).ToUpper();
return Result;
如果您的数据库表很大,我会考虑创建某种TRIGGER
/更新脚本来对所有记录进行URL编码或解码,这样您根本不需要检查,只需编码/解码传入的参数。
答案 1 :(得分:1)
在查询之前进行调整,以便在查询中具有与特定格式对齐的绝对值,并始终检查对数据库中的那些而不是转换它们 - 所以,这可能包括在查询中使用OR
,而不是将整个内容拉入内存 a la ToList
。