在EF LINQ查询中使用字符串方法

时间:2013-09-25 11:32:27

标签: c# linq

我有一种情况,需要比较两个网址,一个进入方法,另一个进入数据库。数据库中的那个可能是或者可能不是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方法,抛出和异常这样说。

有解决方法吗?

2 个答案:

答案 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