2017-01-18 4 views
0

Следующая строка кода, которая выполняет поиск FirstOrDefault в IEnumerable на основе RowIndex, не работает в окне отладки (в окне просмотра, быстрого просмотра и немедленного просмотра). Он выдает исключение System.NullReferenceException в этих окнах. Я использую Visual Studio 2015 обновление 3.Почему поиск FirstOrDefault в IEnumerable <Row> на основе RowIndex не работает в отладочных окнах?

sheetdata.Descendants<Row>().FirstOrDefault(p => p.RowIndex.Value == 2U) 

Но когда я преобразовать его в список и сделать такой же поиск он работает в этих отладочных окнах. Почему это несоответствие?

Это несоответствие не существует, когда я запускаю код. Я вижу это несоответствие только тогда, когда я пытаюсь отлаживать код в этих отладочных окнах.

enter image description here

+5

«Не работает» не описывает, что вы видите вообще. Просьба уточнить и предоставить [mcve]. –

+5

'Convert.ToUInt32 (2))' Боже. '2u' – Will

+0

Это не решает проблему. Я обновил вопрос, избегая конвертировать. –

ответ

3

Я думаю, что QueryProvider из OpenXml имеет проблемы с обработкой Convert.ToUInt32(2), потому что он должен перевести это на свой язык (как QueryProvider для SQL).

Вы должны стараться избегать конвертирования в предикаты и делать это заранее, потому что не все QueryProviders поддерживают все функции и могут генерировать исключения (в основном NotSupportedException).

uint value = Convert.ToUInt32(2); 
sheetdata.Descendants<Row>().FirstOrDefault(p => p.RowIndex.Value == value) 

Вызов .ToList() будет выполнять это в памяти, потому что он будет считывать все значения из вашего листа, а затем находит первое соответствующее значение.

+1

Вы можете написать значение два типа 'uint' как просто' 2u' и использовать это напрямую. Компилятор C# и любой поставщик Linq будут знать намного лучше, что такое '2u', по сравнению с вызовом метода' Convert.ToUInt32 (2) ', который они могут не понимать значения. Кроме того, в контексте операнда в '==' вы можете просто использовать '2', потому что компилятор C# будет достаточно умным, чтобы выбрать нужный тип. Но '2u' является более точным для человека-читателя. –

+0

Благодарим вас за ответ. Но это не решает проблему. Я обновил вопрос, избегая конвертировать. –

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

  • Нет связанных вопросов^_^