当 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 查询失败。我需要能够动态设置经理名称并将其传递给查询,以便我可以将员工正确关联到那里的经理。

当 WHERE 子句具有特殊字符时,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# 中字符串前面的 @ 是什么?