当 WHERE 子句具有特殊字符时,LINQ 查询不返回结果
本文关键字:查询 LINQ 返回 结果 子句 WHERE 特殊字符 | 更新日期: 2023-09-27 18:37:28
在我的脚本中,我动态构建一个字符串,然后将字符串传递到LINQ TO ENTITIES语句的WHERE子句中。当语句运行时,它找不到任何结果,我无法弄清楚为什么。如果我显式地将值硬编码到传递给语句的变量中,它可以正常工作,但是如果我让系统为我构建它,它会失败。为什么会失败?
for (int i = 1; i <= TotalUsers; i++)
{
var CurrentUser = db.Users.Where(u => u.ID == i).Select(u => u.ADUserName).First();
UserPrincipalData = UserPrincipal.FindByIdentity(Context, CurrentUser);
var UserDirectoryData = UserPrincipalData.GetUnderlyingObject() as DirectoryEntry;
var Manager = (string)UserDirectoryData.Properties["manager"].Value;
if (String.IsNullOrEmpty(Manager))
{
Manager = @"Company'Matthew.Verstraete";
}
else
{
var StartIndex = Manager.IndexOf("=") + 1;
var EndIndex = Manager.IndexOf(",", StartIndex);
var Length = EndIndex - StartIndex;
Manager = Manager.Substring(StartIndex, Length);
Manager = @"Company'" + Manager.Replace(" ", ".");
}
var ManagerID = db.Users.Where(u => u.ADUserName == Manager).Select(u => u.ID).FirstOrDefault();
var UpdatedUser = db.Users.Find(i);
UpdatedUser.ManagerID = ManagerID;
db.SaveChanges();
}
通过 DeBug 工作 如果 IF 语句为真并且变量被硬编码为我,那么ManagerID是从查询中正确设置的,如果它失败并转到 ELSE 子句,即使 Manager 变量也动态设置为我,它也会失败。
编辑:代码不会在调试中引发任何错误。变量Manager总是以Company''First.Last的形式获得正确的值(C# 似乎正在转义反斜杠)。所以我无法弄清楚为什么当名称是动态设置而不是静态设置时 LINQ 查询失败。我需要能够动态设置经理名称并将其传递给查询,以便我可以将员工正确关联到那里的经理。

代码包装在 try catch 块中并向我们提供正在抛出的异常会有所帮助。
但我的猜测是,你可能会得到一个 ArgumentOutOfRangeException
如果这是问题所在,那么对于您的 StartIndex 或 EndIndex,您可能会得到 -1,这意味着搜索的字符串不存在。
这将使您的 Length 变量成为负数,并且在负值上使用子字符串时会导致异常。
我会逐步查看您的开始和结束索引的值。
索引:https://msdn.microsoft.com/en-us/library/7cct0x33(v=vs.110).aspx
子:https://msdn.microsoft.com/en-us/library/aka44szs(v=vs.110).aspx
好的,我想我找到了问题。
因此,您在 else 语句中使用了 @ 符号。但是,您说该值是公司''''第一个。使用 @ 符号时,字符串被视为文字,因此它搜索"Company''''First.Last"
如果要搜索"Company''First.Last",则应从 else 语句中删除 @ 符号。
我阅读这篇文章是为了帮助我理解这个问题:C# 中字符串前面的 @ 是什么?