Почему эта ошибка возникает при использовании SingleAsync?

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

        try
        {
            // Find duplicate item
            duplicateItem = await _context.Items
                .SingleAsync(m => m.UserId == userId && m.Name == "some item");
        }
        catch (Exception)
        {
    //Exception more than one item found
        }

[01:48:06 ERR] An exception occurred while iterating over the results of a query for context type '....ApplicationDbContext'. System.InvalidOperationException: Source sequence doesn't contain any elements. at System.Linq.AsyncEnumerable.Single_[TSource](IAsyncEnumerable1 source, CancellationToken cancellationToken) in D:\a\1\s\Ix.NET\Source\System.Interactive.Async\Single.cs:line 136 at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.TaskResultAsyncEnumerable1.Enumerator.MoveNext(CancellationToken cancellationToken) at System.Linq.AsyncEnumerable.SelectEnumerableAsyncIterator2.MoveNextCore(CancellationToken cancellationToken) in D:\a\1\s\Ix.NET\Source\System.Interactive.Async\Select.cs:line 106 at System.Linq.AsyncEnumerable.AsyncIterator1.MoveNext(CancellationToken cancellationToken) in D:\a\1\s\Ix.NET\Source\System.Interactive.Async\AsyncIterator.cs:line 98 at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor1.EnumeratorExceptionInterceptor.MoveNext(CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteSingletonAsyncQuery[TResult](QueryContext queryContext, Func2 compiledQuery, IDiagnosticsLogger`1 logger, Type contextType)

System.InvalidOperationException: Source sequence doesn't contain any elements. at System.Linq.AsyncEnumerable.Single_[TSource](IAsyncEnumerable1 source, CancellationToken cancellationToken) in D:\a\1\s\Ix.NET\Source\System.Interactive.Async\Single.cs:line 136
at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.TaskResultAsyncEnumerable
1.Enumerator.MoveNext(CancellationToken cancellationToken) at System.Linq.AsyncEnumerable.SelectEnumerableAsyncIterator2.MoveNextCore(CancellationToken cancellationToken) in D:\a\1\s\Ix.NET\Source\System.Interactive.Async\Select.cs:line 106
at System.Linq.AsyncEnumerable.AsyncIterator
1.MoveNext(CancellationToken cancellationToken) in D:\a\1\s\Ix.NET\Source\System.Interactive.Async\AsyncIterator.cs:line 98 at Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor1.EnumeratorExceptionInterceptor.MoveNext(CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteSingletonAsyncQuery[TResult](QueryContext queryContext, Func2 compiledQuery, IDiagnosticsLogger`1 logger, Type contextType)

Single[Async] выкинет, если есть ноль или несколько элементов, я не понимаю ваш вопрос здесь.
DavidG 20.06.2019 18:12

Примечание: если вы хотите проверить, есть ли в коллекции дубликаты, это можно сделать без исключений. Просто .Where(<your condition>).Take(2).ToList(), а затем просто проверьте длину этого списка

Aleks Andreev 20.06.2019 18:19

@AleksAndreev Забавный факт: вызов Single в Entity Framework в любом случае делает Take(2)...

DavidG 20.06.2019 18:22

Вместо этого используйте SingleOrDefaultAsync, Single ожидает один и только один объект, который соответствует заданному вами условию (ровно один), а SingleOrDefault ожидает в большинстве один совпадающий объект (ноль или один).

Ammar 20.06.2019 23:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
4
13 402
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы путаете SingleAsync с SingleOrDefaultAsync.

SingleAsync -> означает, что он будет сгенерирован, если не будет найдено ни одной записи или будет найдено более одной записи.

Asynchronously returns the only element of a sequence that satisfies a specified condition, and throws an exception if more than one such element exists.

SingleOrDefaultAsync -> означает, что будет выброшено, если будут найдены две или более записей

Asynchronously returns the only element of a sequence that satisfies a specified condition or a default value if no such element exists; this method throws an exception if more than one element satisfies the condition.

Другие вопросы по теме