{"record":{"id":"c1319af721ff9441","repo":"dotnet/reactive","slug":"more-than-one-matching-element","errorCode":null,"errorMessage":"MORE_THAN_ONE_MATCHING_ELEMENT","messagePattern":"MORE_THAN_ONE_MATCHING_ELEMENT","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"Rx.NET/Source/src/System.Reactive/Linq/Observable/SingleAsync.cs","lineNumber":120,"sourceCode":"                    var b = false;\n\n                    try\n                    {\n                        b = _predicate(value);\n                    }\n                    catch (Exception ex)\n                    {\n                        ForwardOnError(ex);\n                        return;\n                    }\n\n                    if (b)\n                    {\n                        if (_seenValue)\n                        {\n                            try\n                            {\n                                throw new InvalidOperationException(Strings_Linq.MORE_THAN_ONE_MATCHING_ELEMENT);\n                            }\n                            catch (Exception e)\n                            {\n                                ForwardOnError(e);\n                            }\n                            return;\n                        }\n\n                        _value = value;\n                        _seenValue = true;\n                    }\n                }\n\n                public override void OnCompleted()\n                {\n                    if (!_seenValue)\n                    {\n                        try","sourceCodeStart":102,"sourceCodeEnd":138,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/Rx.NET/Source/src/System.Reactive/Linq/Observable/SingleAsync.cs#L102-L138","documentation":"The predicate-based SingleAsync overload throws InvalidOperationException(Strings_Linq.MORE_THAN_ONE_MATCHING_ELEMENT) when a second element satisfying the predicate arrives after one was already matched, forwarding it via OnError. It enforces 'exactly one matching element' like LINQ's Single(predicate).","triggerScenarios":"source.SingleAsync(x => predicate(x)) on a stream where two distinct OnNext values satisfy the predicate before completion.","commonSituations":"Selecting 'the' active record (e.g. current session, default profile) where data integrity allows several active rows; race conditions creating duplicates; a predicate written too loosely (e.g. status == Active matching stale rows).","solutions":["Tighten the predicate so exactly one element matches, or deduplicate upstream with Distinct/DistinctUntilChanged.","Use FirstAsync(predicate) when only the first match is needed, or SingleOrDefaultAsync if zero-or-one is acceptable.","Fix the underlying data/source so the uniqueness invariant actually holds."],"exampleFix":"// before\nvar active = await sessions.SingleAsync(s => s.IsActive);\n// after\nvar active = await sessions.Where(s => s.IsActive).Take(1).FirstAsync();","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { var v = await source.SingleAsync(x => x.IsActive); }\ncatch (InvalidOperationException) { var v = await source.Where(x => x.IsActive).FirstAsync(); }","preventionTips":["Tighten predicates so uniqueness holds, or deduplicate upstream.","Use FirstAsync(predicate) when any match suffices.","Enforce the underlying data invariant (e.g. single active record) at write time."],"tags":["linq","single-operator","predicate","multiple-matches"],"backgroundTag":"value-out-of-range","analyzedSha":"94b5d5ab912789f5abe9a72138a25bbd716fe59c","analyzedAt":"2026-09-15T02:26:24.759Z","contentChangedAt":"2026-09-15T02:26:24.759Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}