2010-07-10 30 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) 
      ) 
     ); 
    } 
}