2010-06-18 5 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

+0

Если вы используете Dynamic LINQ, вы можете попробовать изменить выражение '.Where' на' .Where ("PARTICIPANT_ID = @ p0", 10000) '. Но чтобы ответить на вопрос об исключении ArgumentOutOfRangeException, см. Ответ Дэвида М. –

ответ

7

Используйте это:

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

Это будет возвращать нулевое значение, если нет первого элемента.

Но вам может понадобиться исправить ваш код (реплицированный здесь) сначала - синтаксис .Where выглядит изворотливым.

+0

Вы действительно пытались запустить этот код? Он даже не компилируется. Где нужна лямбда. Вот ссылка: http://msdn.microsoft.com/en-us/library/bb534803.aspx –

+0

Очень верно - вплоть до .FirstOrDefault, это был только код OP, возвращенный ему. –

+1

@ Cylon Cat, он может использовать библиотеку Dynamic LINQ. http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx –

0

Вам нужно выражение лямбда в. Где.

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

Его код, похоже, работает, за исключением случаев, когда нет возвращенных элементов. «Лямбда» не проблема, «[0]» есть. – ANeves

+0

Вопрос состоял из двух частей: отсутствия == и исключения. Cylon Cat ответил на == часть. –

+0

@ANeves, «кажется, работает»? Каждая перегрузка IEnumerable .Where() требует делегата. Это не так. Где можно работать, когда первым параметром является строка. –

0

Try:

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

или что-то подобное.

1

Ошибка ArgumentOutOfRangeException возникает, когда вы пытаетесь использовать индекс для получения первого элемента из (пустого) списка. Использование метода расширения FirstOrDefault() является удобным способом возврата первого элемента коллекции, если он есть, в противном случае для возврата null.

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

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.firstordefault.aspx

Смежные вопросы