如何在LINQ中使用Regex.Replace方法

时间:2018-03-31 08:23:02

标签: c# regex asp.net-mvc linq

我有一个控制器,其中包含以下方法 getMail()

public JsonResult getMail(string id)
{
    int Id = Convert.ToInt32(id);
    string pattern = @"\bmem_id\b";
    string replace = "100";         
    var result = (from a in db.tblmail_type
                  where a.Id == Id                              
                  select new MailModel
                  {
                      subject = a.Subject,
                      Content = Regex.Replace(a.Content, pattern, replace);
                  });
    return Json(result, JsonRequestBehavior.AllowGet);
}

此方法用于获取邮件内容。在获取内容之前,我想要替换" mem_id"至" 100"在邮件内容中。默认内容如下:

  

内容="您已成功注册会员ID:mem_id"

我在LINQ中使用了Regex.Replace()方法。但是这段代码并没有改变内容。当我将此代码更改为下面给出的此表单时,它可以正常工作。

public JsonResult getMail(string id)
{
    int Id = Convert.ToInt32(id);
    var input = db.tblmail_type.Where(x=>x.Id==Id).FirstOrDefault().Content;
    string pattern = @"\bmem_id\b";
    string replace = "100";            
    string content = Regex.Replace(input, pattern, replace);
    var result = (from a in db.tblmail_type
                  where a.Id == Id
                  select new MailModel
                  {
                      subject = a.Subject,
                      Content = content
                  });
    return Json(result, JsonRequestBehavior.AllowGet);
}

为什么会这样?任何人都可以指出这个奇怪问题背后的原因吗?如何更换"内容"在LINQ内?

1 个答案:

答案 0 :(得分:2)

您可以使用以下任何一种解决方案

解决方案1:

不幸的是,您将无法将正则表达式处理逻辑直接发送到数据库。 您需要从数据库中获取Content,然后遍历列表并应用正则表达式。 这可以通过使用AsEnumerable()来完成。它将查询分为两部分。 第一部分是inside part(AsEnumerable()之前的查询)作为Linq-to-SQL执行。 第二部分是outside part(AsEnumerable()之后的查询)作为Linq-to-Objects执行。 第一部分在数据库上执行,所有数据都引入客户端。 第二部分(这里是where,select)在客户端执行。 因此,简而言之AsEnumerable()运算符将查询处理移至客户端。

var result = ( from a in db.tblmail_type.AsEnumerable()
               where a.Id == Id
               select new MailModel {
                        subject = a.Subject,
                        Content = Regex.Replace(a.Content, pattern, replace)
              });

解决方案2:

var result = db.tblmail_type.Where(x => x.Id == Id).AsEnumerable().Select(x => new MailModel { Content = Regex.Replace(x.Content, pattern, replace) , subject = x.Subject}).ToList();

解决方案3:

 var result = db.tblmail_type.Where(x => x.Id == Id).ToList();
 result.ForEach(x => x.Content = Regex.Replace(x.Content, pattern, replace));