Использовать метод замены в запросе Linq-Sql - PullRequest
1 голос
/ 10 июля 2010

Я использовал RegEx для удаления тегов 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();
          }

Ответы [ 2 ]

2 голосов
/ 10 июля 2010

Здесь две вещи не так:

  1. Вы анализируете HTML с помощью RegEx. Вы должны использовать HTML Agility Pack для анализа HTML, а не полагаться на RegEx. См. здесь для объяснения причин.
  2. Вы рассматриваете Linq2Sql так, как если бы SQL не существовал - при использовании Replace он пытается передать его на SQL Server - это, конечно, не удается, поскольку в SQL нет этой функции. В любом случае это не удастся, так как нет перегрузки на string.Replace, которая принимает три строки.

Вы не объяснили, чего именно вам нужно достичь, но если вам нужно сохранить какой-то HTML в SQL, я предлагаю вам проанализировать его с пакетом Agility и использовать его для очистки тегов, а затем сохранить результат в SQL Server. .

0 голосов
/ 10 июля 2010

Исходя из сообщения об ошибке, я предполагаю, что LINQ to SQL не может перевести раздел RegEx операторов LINQ, поскольку 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)
            )
        );
     }
}
...