首页 文章

当WHERE子句具有特殊字符时,LINQ查询不返回结果

提问于
浏览
0

在我的脚本中,我动态构建一个字符串,然后将字符串传递给 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();
}

如果 IF 语句为真并且变量被硬编码给我,则通过DeBug工作然后从查询中正确设置 ManagerID ,如果它失败并转到 ELSE 子句,即使 Manager 变量动态设置给我也会失败 .

编辑:代码不会在调试中抛出任何错误 . 变量 Manager 总是以 Company\\First.Last 的形式得到一个正确的值(C#似乎是逃避反斜杠) . 因此,当动态设置名称而不是静态设置名称时,我无法弄清楚为什么LINQ查询失败 . 我需要能够动态设置管理器名称并将其传递给查询,以便我可以正确地将员工与管理员关联 .

1 回答

  • 0

    将代码包装在try catch块中并为我们提供抛出的异常将有所帮助 .

    但我的猜测是你可能会得到一个ArgumentOutOfRangeException

    如果这是问题,那么对于您的StartIndex或您的EndIndex,您可能会得到-1,这意味着搜索的字符串不存在 .

    这将使您的Length变量成为负数,并且当在负值上使用子字符串时将导致异常 .

    我会逐步查看您的开始和结束索引的值 .

    IndexOf: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语句中使用@符号 . 但是,你说 Value 是公司\ First.Last . 使用@符号,字符串被视为文字,因此它正在搜索“Company \ First.Last”

    如果要搜索“Company \ First.Last”,则应从else语句中删除@符号 .

    我读这篇文章是为了帮助我理解这个问题:What's the @ in front of a string in C#?

相关问题