2016-03-04 38 views
0

在我的腳本中,我動態地構建了一個字符串,然後將該字符串傳遞給LINQ TO ENTITIES語句的WHERE子句。當語句運行時,它找不到任何結果,我找不到原因。如果我明確地將一個值硬編碼到傳入該語句的變量中,它可以正常工作,但如果我讓系統爲我構建它,它將失敗。爲什麼這是失敗的?當WHERE子句有特殊字符時,LINQ查詢不返回結果

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說法是真實的,變量是硬編碼到我那麼ManagerID從查詢設置正確,如果失敗,並轉到ELSE條款即使Manager變量就會失敗也是動態設置給我的。

編輯: 該代碼不會在調試中引發任何錯誤。變量Manager始終以Company\\First.Last的形式獲得適當的值(C#似乎在逃避反斜槓)。所以我無法弄清楚爲什麼LINQ查詢失敗時,動態設置名稱,但不是靜態的。我需要能夠動態設置經理姓名並將其傳遞給查詢,以便我可以正確地將員工關聯到經理。

+2

我很抱歉,但你從哪裏撿起這一切壞的命名約定。 'var CurrentUser ...'應該是'var currentUser'。它使您的示例代碼SUPER難以閱讀。 – Phill

+0

'Manager'的價值是什麼?你試過調試它嗎? 「經理」屬性中是否有可能沒有等號? – juharr

+0

@juharr我已經調試過了,沒有錯誤發生,並且'Manager'總是被設置爲'Company \\ First'格式的正確值。最後'(C#似乎在逃避反斜槓) – Matthew

回答

0

這將有助於將您的代碼包裝在try catch塊中,併爲我們提供拋出的異常。

但我的猜測是,你可能會得到一個ArgumentOutOfRangeException

如果是這樣的問題,那麼您開始索引或您的ENDINDEX你可能會得到-1,這意味着字符串搜索不存在。

這將使您的長度變量爲負數,並且當對負值使用子字符串時會導致異常。

我會逐步查看您的開始和結束索引的值。

的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


好吧,我想我找到了問題。

因此,您在其他語句中使用了@符號。但是,你說的價值是公司第一。最後。使用@符號,字符串被視爲文字,因此它正在搜索「Company \\ First.Last」

如果您要搜索「Company \ First.Last」,則應從其他位置刪除@符號聲明。

我看到這篇文章,幫助我理解這個問題: What's the @ in front of a string in C#?

+0

代碼運行時沒有錯誤,我已經調試過它,並且可以通過一切來觀察它的步驟,並且不會引發任何錯誤,並且'Manager'總是以'Company \\ First.Last'的格式設置爲適當的值(C#似乎逃避反斜槓)。這與'IndexOf'或'Substring'命令無關。 – Matthew

+0

對不起,我已經花了一點時間回到這個我被拉進另一個項目。我只是通過刪除'@' symbel來測試,現在代碼讀取'Manager =「Company \\」+ Manager.Replace(「」,「。」);'它現在正在工作。 – Matthew

相關問題