我目前面临调试(VS2022)似乎无法解决的问题。
在下面的代码中,我使用了 .NET 的 Gmail API 包,我可以从给定的电子邮件中提取电子邮件主题(字符串)和电子邮件地址(不包括/相关)。
var subject = m.Payload.Headers.Where(x => x.Name == "Subject").First().Value;
然后我使用 EntityFramework Core 通过 LINQ 在我的 SQL 数据库 (EmailSubjectMappings) 中的映射表中进行搜索,以找到满足以下条件的相应行(如果我自己输入的“模式”字符串是主 subject 的子字符串 字符串)
var subjectMapping = context.EmailSubjectMappings.AsEnumerable().Where(x => (subject.Contains(x.EmailSubject))).FirstOrDefault();
在subject不包含单引号的情况下,这工作正常。例如:
输入
subject = "Fwd: 您的订单已发货"
x.EmailSubject = "您的订单已发货"
预期结果:subjectMapping.EmailShippingStatus =“订单延迟”
实际结果:subjectMapping.EmailShippingStatus = "Order Delayed"
但是,在单引号的情况下:
输入:
subject = “转发:您的订单无法送达”
x.EmailSubject = "您的订单无法送达"
预期结果:subjectMapping.EmailShippingStatus =“订单未送达”
实际结果:subjectMapping.EmailShippingStatus = null
我进入调试器,检查监视窗口中的每个变量以查看根本原因是什么:
context.EmailSubjectMappings.ToList().FirstOrDefault(x=> subject.Contains("Your Order Couldn't Be Delivered")) -> null (not expected)
context.EmailSubjectMappings.ToList().FirstOrDefault(x=>"Fwd: Your Order Couldn't Be Delivered".Contains(x.EmailSubject)) -> "Order Not Delivered" (expected)
context.EmailSubjectMappings.ToList().FirstOrDefault(x=>"Fwd: 您的订单无法送达".Contains("您的订单无法送达")) -> "订单未送达" ( 预期)
所以通过过渡,看起来变量 subject 是问题,并且在监视窗口中输入它也显示预期的字符串:“Fwd:您无法交付”
我还尝试使用 Regex 删除所有可能的隐藏字符
string output = Regex.Replace(subject, "[^\u0021-\u007E]", "");
甚至使用 IndexOf() 而不是 .Contains.
所以我很难过。是否存在某种内存问题导致我的 subject 变量发生变化?它是 LINQ 或 EF Core 的某些属性吗?感谢您的帮助!