C# 在Linq Sql查询中使用Replace方法

C# 在Linq Sql查询中使用Replace方法,c#,regex,linq-to-sql,C#,Regex,Linq To Sql,我使用RegEx删除LINQ-SQL查询中的HTML标记,但引发了以下错误: 方法“System.String Replace(System.String,System.String,System.String)”不支持作为SQL执行 Help helpdbession=new Help(); IEnumerable articles=null; if(lang.ToLower()=“en”) { articles=helpDBSession.articles.Where(artilce=>ar

我使用RegEx删除LINQ-SQL查询中的HTML标记,但引发了以下错误:

方法
“System.String Replace(System.String,System.String,System.String)”
不支持作为SQL执行

Help helpdbession=new Help();
IEnumerable articles=null;
if(lang.ToLower()=“en”)
{
articles=helpDBSession.articles.Where(artilce=>artilce.NameEn.Contains(searchPattern)||
System.Text.RegularExpressions.Regex.Replace(artilce.ContentEn,“,String.Empty).Contains(searchPattern));
}
其他的
{
articles=helpDBSession.articles.Where(artilce=>artilce.NameAr.Contains(searchPattern)||
System.Text.RegularExpressions.Regex.Replace(artilce.ContentAr,“,String.Empty).Contains(searchPattern));
}
if(articles!=null&&articles.Count()>0)
{
return articles.ToList();
}
这里有两件事不对:

  • 您正在使用正则表达式解析HTML。您应该使用来解析HTML,而不是依赖正则表达式。请参阅以了解原因
  • 您将Linq2Sql视为SQL不存在—当使用
    Replace
    时,它会尝试将其传递给SQL Server—这当然会失败,因为SQL没有此功能。无论如何这都会失败,因为
    字符串没有重载。替换需要三个字符串的

  • 您没有解释需要实现什么,但是如果您需要在SQL中存储一些HTML,我建议您使用agility pack解析它,并使用它清除标记,然后将结果保存到SQL Server。

    根据错误消息,我假设LINQ to SQL无法转换LINQ语句的RegEx部分,因为SQL Server不支持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)
                )
            );
         }
    }
    
    Help helpdbession=new Help();
    IEnumerable articles=null;
    if(lang.ToLower()=“en”)
    {
    articles=helpDBSession.articles.Where(
    artilce=>artilce.NameEn.Contains(searchPattern)
    )
    }
    其他的
    {
    articles=helpDBSession.articles.Where(
    artilce=>artilce.NameAr.Contains(searchPattern)
    )
    }
    if(articles!=null&&articles.Count()>0)
    {
    if(lang.ToLower()=“en”)
    {
    return articles.ToList()。其中(
    artilce=>System.Text.RegularExpressions.Regex.Replace(
    artilce.ContentEn,
    “”,String.Empty)。包含(searchPattern)
    )
    );
    }
    其他的
    {
    return articles.ToList()。其中(
    artilce=>System.Text.RegularExpressions.Regex.Replace(
    artilce.ContentAr,
    “”,String.Empty)。包含(searchPattern)
    )
    );
    }
    }
    
    如果您提供了实际的linq代码,则会有所帮助。
    String.Replace
    函数只接受2个参数并返回一个
    字符串。你能给我们看看你的密码吗?@Matt-很好。我假设它是字符串的静态函数,但看起来它是一个局部函数。它转换为类似于
    语句的
    ,因此没有RegExp。您可以在客户端上进行筛选,也可以使用M$SQL Server的CLR集成。
    
    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)
                )
            );
         }
    }