Содержание
У меня есть приложение asp.net, в котором я использую linq для манипулирования данными. Во время работы я получаю исключение «Последовательность не содержит соответствующий элемент».
Что ж, я ожидаю, что именно эта строка выдает исключение:
First() сгенерирует исключение, если не найдет подходящих элементов. Учитывая, что вы тестируете на null сразу после этого, звучит так, как будто вы хотите FirstOrDefault() , который возвращает значение по умолчанию для типа элемента (которое является нулевым для ссылочных типов), если не найдено ни одного соответствующего элемента:
Другими вариантами, которые следует учитывать в некоторых ситуациях, являются Single() (когда вы считаете, что есть только один соответствующий элемент) и SingleOrDefault() (когда вы считаете, что существует только один или ноль соответствующих элементов). Я подозреваю, что FirstOrDefault — лучший вариант в данном конкретном случае, но все равно стоит знать о других.
С другой стороны, похоже, что на самом деле вам может быть лучше с присоединением здесь, во-первых. Если вам было все равно, что он будет выполнять все совпадения (а не только первые), вы можете использовать:
Это проще и эффективнее ИМО.
Даже если вы решите продолжать, у меня есть пара предложений:
-
Избавиться от внешнего, if . Вам это не нужно, как будто Count равен нулю, тело цикла for никогда не выполнится
Используйте эксклюзивные верхние границы для циклов — они более идиоматичны в C #:
Устранить общие подвыражения:
По возможности используйте foreach вместо for чтобы начать с:
21 просмотра
1 ответ
1933 Репутация автора
У меня есть следующее сопоставление Entity Framework (v6.1.3):
Оба столбца имеют тип данных = "varchar" в моей базе данных и правильные размеры:
Однако некоторые из моих модульных тестов не работают с этой ошибкой:
" System.InvalidOperationException: Последовательность не содержит соответствующего элемента "
Я прочитал в соответствующем сообщении, что вы можете получить ошибку выше, если вы передаете недопустимый тип HasColumnType методу, но в моем случае «varchar» должен быть действительным.
Любые идеи, что может быть неправильным?
Вот как эти свойства определены в моей сущности:
Ниже приведен пример одного теста, который не работает в первой строке:
_context в этом случае имеет тип MemoryEnterprisePaycorCodeFirstContext :
Что наследует от моего public class EnterprisePaycorCodeFirstContext : DbContext
Этот класс — это то, где я инициализирую мои сопоставления объектов:
Может ли это быть потому, что я использую Effort MemoryContext против реального контекста БД?
Ответы (1)
плюса
1933 Репутация автора
Я понял, что это было. Оказывается, я использовал Effort библиотеку, которая не поддерживает некоторые типы столбцов, как указано в @Balah. Я использовал свою технику для обхода конфигурации сопоставления сущностей при выходе из моего контекста памяти: Усилия (EF Unit Testing), дающего ошибки
У меня есть asp.net приложение, в котором я использую linq для обработки данных. Во время работы, я получаю исключение "последовательность не содержит соответствующий элемент".
4 ответа:
Ну, я бы ожидал, что именно эта строка бросает исключение:
First() вызовет исключение, если он не может найти соответствующие элементы. Учитывая, что вы тестируете null сразу после этого, похоже, что вы хотите FirstOrDefault() , который возвращает значение по умолчанию для типа элемента (которое равно null для ссылочных типов), если соответствующие элементы не найдены:
другие варианты для рассмотрения в некоторых ситуации бывают Single() (когда вы считаете, что есть ровно один соответствующий элемент) и SingleOrDefault() (когда вы считаете, что есть ровно один или ноль совпадающих элементов). Я подозреваю, что FirstOrDefault это лучший вариант в данном конкретном случае, но это стоит знать о других в любом случае.
С другой стороны, похоже, что вам действительно может быть лучше с присоединением здесь в первую очередь. Если бы вы не заботились, что это будет делать все матчи (а не только первый) вы могли бы использовать:
это проще и более эффективный ИМО.
даже если вы do решите держать петлю, у меня есть несколько предложений:
-
избавиться от внешних if . Вам это не нужно, так как если Count равен нулю, тело цикла for никогда не будет выполняться
используйте эксклюзивные верхние границы для циклов — они более идиоматичны C#:
устранение общих подвыражений:
где можно использовать foreach вместо for для начала: