2010-07-10 65 views
1

我用正则表达式来LINQ-SQL查询中删除HTML标签,但下面的错误已抛出:使用替换法在LINQ-SQL查询

方法'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(); 
      } 
+0

如果你提供的实际LINQ代码这将有助于。 – 2010-07-10 13:28:54

+2

'String.Replace'函数只需要2个参数并返回一个'string'。你能告诉我们你的代码吗? – 2010-07-10 13:29:45

+0

@Matt - 好点。我认为这是一个String的静态函数,但看起来像是一个本地函数。 – Kobi 2010-07-10 13:32:32

回答

2

两件事情:

  1. 你用正则表达式解析HTML。您应该使用HTML Agility Pack解析出HTML,而不是依赖RegEx。有关原因,请参阅here
  2. 您正在对待Linq2Sql,就好像SQL不在身边 - 当使用Replace时,它会尝试将它传递给SQL Server--当然这会失败,因为SQL没有此功能。无论如何,这将会失败,因为string.Replace不会超过三个字符串。

你没有解释你到底需要达到什么目的,但是如果你需要在SQL中存储一些HTML,我建议你用敏捷包解析它,然后用它清理标签,然后保存结果到SQL Server。

0

基于错误消息,我假设LINQ to SQL无法翻译LINQ语句的RegEx部分,因为SQLServer不支持RegEx。

您将有:

  • 从数据库中获取的文章与“包含”您的WHERE语句的部分。
  • 将结果转换为列表。
  • 将您的正则表达式应用到列表中的某处。

例如:

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) 
      ) 
     ); 
    } 
}