使用SingleAsync时为什么会发生此错误?

时间:2019-06-20 16:10:57

标签: c# entity-framework linq asp.net-core

查找项目是否重复。 预期:仅当发现多个项目时才会引发异常。但是我们在这里有另外一个例外吗?

        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]遍历上下文类型'.... ApplicationDbContext'的查询结果时发生异常。   System.InvalidOperationException:源序列不包含任何元素。      在System.Linq.AsyncEnumerable.Single_ [TSource](IAsyncEnumerable 1 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 cancelleToken)      位于System.Linq.AsyncEnumerable.SelectEnumerableAsyncIterator 2.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 cancellingToken)在D:\ a \ 1 \ s \ Ix.NET \ Source \ System.Interactive.Async \ AsyncIterator.cs:line 98中      在Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor 1.EnumeratorExceptionInterceptor.MoveNext(CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteSingletonAsyncQuery[TResult](QueryContext queryContext, Func 2编译的查询中,IDiagnosticsLogger`1记录器,类型为contextType)

     

System.InvalidOperationException:源序列不包含任何序列   元素。在   System.Linq.AsyncEnumerable.Single_ [TSource](IAsyncEnumerable 1 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   cancelToken)   System.Linq.AsyncEnumerable.SelectEnumerableAsyncIterator 2.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   cancelToken)在   D:\ a \ 1 \ s \ Ix.NET \ Source \ System.Interactive.Async \ AsyncIterator.cs:line   98岁   Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor 1.EnumeratorExceptionInterceptor.MoveNext(CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteSingletonAsyncQuery[TResult](QueryContext queryContext, Func 2已编译查询,IDiagnosticsLogger`1记录器,类型   contextType)

1 个答案:

答案 0 :(得分:3)

您将SingleAsyncSingleOrDefaultAsync混淆了。

SingleAsync->表示如果未找到任何条目或一个以上条目,则它将抛出

  

异步返回满足以下条件的序列中的唯一元素   指定的条件,如果不止一个这样的条件,则抛出异常   元素存在。

SingleOrDefaultAsync->表示如果找到两个或更多条目,它将抛出

  

异步返回满足以下条件的序列中的唯一元素   指定条件或默认值(如果不存在此类元素);这个   如果多个元素满足以下条件,则方法将引发异常   条件。