String.Contains 在涉及单引号时评估 false 的方法

问题描述 投票:0回答:0

我目前面临调试(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

我进入调试器,检查监视窗口中的每个变量以查看根本原因是什么:

  1. context.EmailSubjectMappings.ToList().FirstOrDefault(x=> subject.Contains("Your Order Couldn't Be Delivered")) -> null (not expected)

  2. context.EmailSubjectMappings.ToList().FirstOrDefault(x=>"Fwd: Your Order Couldn't Be Delivered".Contains(x.EmailSubject)) -> "Order Not Delivered" (expected)

  3. context.EmailSubjectMappings.ToList().FirstOrDefault(x=>"Fwd: 您的订单无法送达".Contains("您的订单无法送达")) -> "订单未送达" ( 预期)

所以通过过渡,看起来变量 subject 是问题,并且在监视窗口中输入它也显示预期的字符串:“Fwd:您无法交付”

我还尝试使用 Regex 删除所有可能的隐藏字符

string output = Regex.Replace(subject, "[^\u0021-\u007E]", "");

甚至使用 IndexOf() 而不是 .Contains.

所以我很难过。是否存在某种内存问题导致我的 subject 变量发生变化?它是 LINQ 或 EF Core 的某些属性吗?感谢您的帮助!

c# .net linq entity-framework-core contains
© www.soinside.com 2019 - 2024. All rights reserved.