1

我有一个需要比较两个 url 的情况,一个进入方法,另一个进入数据库。数据库中的那个可能会或可能不会被 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,但是数据库中的参数呢?这个失败是因为 EF 将无法识别 UrlDecode 方法并抛出异常。

有解决方法吗?

4

2 回答 2

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/update 脚本来对所有记录进行 URL 编码或解码,这样您根本不必检查,只需对传入的参数进行编码/解码。

于 2013-09-25T11:35:52.140 回答
1

在查询之前进行调整,以便您在查询中获得与特定格式对齐的绝对值,并始终检查数据库的比较,而不是转换它们 - 因此,这可能包括OR在您的查询中使用,而不是把整件事都记在心里啦 ToList

于 2013-09-25T11:36:57.770 回答