在Linq-Sql查询中使用替换方法

时间:2010-07-10 13:25:15

标签: c# regex linq-to-sql

我使用RegEx删除LINQ-SQL查询中的HTML TAGS,但抛出了以下错误:

  

不支持将方法'System.String Replace(System.String, System.String, System.String)'作为SQL执行。

Help helpDBSession = new Help();
          IEnumerable<Article> articles = null;
          if (lang.ToLower() == "en")
          {
              articles = helpDBSession.Articles.Where(artilce =>  artilce.NameEn.Contains(searchPattern) ||
                       System.Text.RegularExpressions.Regex.Replace(artilce.ContentEn, "<(.|\n)*?>",String.Empty).Contains(searchPattern));
          }
          else
          {
              articles = helpDBSession.Articles.Where(artilce => artilce.NameAr.Contains(searchPattern) ||

                  System.Text.RegularExpressions.Regex.Replace(artilce.ContentAr, "<(.|\n)*?>", String.Empty).Contains(searchPattern));
          }
          if (articles != null && articles.Count() > 0)
          {
              return articles.ToList();
          }

2 个答案:

答案 0 :(得分:2)

这里有两件事:

  1. 您正在使用RegEx解析HTML。您应该使用HTML Agility Pack来解析HTML,而不是依赖于RegEx。有关原因,请参阅here
  2. 您正在使用Linq2Sql,就好像SQL不存在一样 - 当使用Replace时,它会尝试将其传递给SQL Server - 这当然会失败,因为SQL没有此功能。无论如何,这都会失败,因为string.Replace没有超载需要三个字符串。
  3. 您没有解释您需要实现什么,但如果您需要在SQL中存储一些HTML,我建议您使用敏捷包解析它并使用它来清除标记,然后将结果保存到SQL Server

答案 1 :(得分:0)

根据错误消息,我假设LINQ to SQL无法转换LINQ语句的RegEx部分,因为SQLServer不支持RegEx。

你必须:

  • 使用where语句的“Contains”部分从数据库中获取文章。
  • 将结果转换为列表。
  • 将正则表达式应用于列表中的位置。

例如:

Help helpDBSession = new Help();

IEnumerable<Article> articles = null;

if (lang.ToLower() == "en")
{
    articles = helpDBSession.Articles.Where(
                   artilce =>  artilce.NameEn.Contains(searchPattern)
    )
}
else
{
    articles = helpDBSession.Articles.Where(
                   artilce => artilce.NameAr.Contains(searchPattern)
    )
}

if (articles != null && articles.Count() > 0)
{
    if (lang.ToLower() == "en")
    {
        return articles.ToList().Where(
            artilce => System.Text.RegularExpressions.Regex.Replace(
                artilce.ContentEn, 
                "<(.|\n)*?>",String.Empty).Contains(searchPattern)
            )
        );
    }
    else
    {
        return articles.ToList().Where(
            artilce => System.Text.RegularExpressions.Regex.Replace(
                artilce.ContentAr, 
                "<(.|\n)*?>",String.Empty).Contains(searchPattern)
            )
        );
     }
}