2010-06-18 107 views
2

希望這是一個星期五的問題的一個很好的壘球,但我有下面的代碼行:需要一個LINQ ArgumentOutOfRangeException幫助C#

//System.ArgumentOutOfRangeException generated if there is no matching data 
currentAnswers = new CurrentAnswersCollection() 
    .Where("PARTICIPANT_ID", 10000).Load()[0]; 

CurrentAnswersCollection是一個強類型集合視圖所填充回到我的數據庫。 問題當然是,如果沒有相應的PARTICIPANT_ID = 10000,我會收到錯誤消息。

有沒有更好的方法來寫這個,所以我根本得不到錯誤信息? 我只是不太瞭解LINQ語法,知道我是否可以先測試這個存在?

謝謝。

+0

調查堆棧跟蹤。它通常會給出非常精確的錯誤位置。 – Andrey 2010-06-18 14:12:56

+0

如果您使用動態LINQ,您可以嘗試將'.Where'表達式更改爲'.Where(「PARTICIPANT_ID = @ p0」,10000)''。但要回答關於ArgumentOutOfRangeException的問題,請參閱David M的回答 – 2010-06-18 14:44:18

回答

7

使用此:

currentAnswers = new CurrentAnswersCollection() 
    .Where("PARTICIPANT_ID", 10000).Load() 
    .FirstOrDefault(); 

它會返回null,如果沒有第一要素。

但是您可能需要先修復您的代碼(此處複製) - .Where語法看起來不太可靠。

+0

您是否真的嘗試運行此代碼?它甚至不應該編譯。 .Where需要一個lambda。這裏是參考:http://msdn.microsoft.com/en-us/library/bb534803.aspx – 2010-06-18 14:22:22

+0

非常正確 - 直到.FirstOrDefault,這只是OP的代碼返回給他。 – 2010-06-18 14:25:02

+1

@Cylon貓,他可以使用動態LINQ庫。 http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – 2010-06-18 14:30:07

0

您需要.Where中的lambda表達式。

currentAnswers = new CurrentAnswersCollection() 
    .Where(c => c.PARTICIPANT_ID == 10000).Load().FirstOrDefault(); 
+1

他的代碼似乎工作,除非沒有項目返回。 「Lambda」不是問題,「[0]」是。 – ANeves 2010-06-18 14:14:53

+0

這個問題有兩個部分,缺少==和例外。賽龍貓回答了==部分。 – 2010-06-18 14:19:23

+0

@ANeves,「似乎工作」? IEnumerable的每個重載.Where()都需要一個委託。沒有辦法。當第一個參數是一個字符串時,哪裏可以工作。 – 2010-06-18 14:19:59

0

嘗試:

var answers = new CurrenAnswersCollection().Where("PARTICIPANT_ID", 10000); 
if(answers.Count() >= 1) currentAnswers = answers.Load()[0]; 

或類似的東西。