Последовательность не содержит соответствующий элемент

У меня есть приложение 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 для начала:

Ссылка на основную публикацию
Adblock
detector