我有一个控制器,其中包含以下方法 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内?
答案 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));