在我的脚本中,我动态构建一个字符串,然后将字符串传递给 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 回答
将代码包装在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#?