{"record":{"id":"8dac86cbda6a361c","repo":"dotnet/reactive","slug":"strings-linq-more-than-one-element","errorCode":null,"errorMessage":"Strings_Linq.MORE_THAN_ONE_ELEMENT","messagePattern":"Strings_Linq\\.MORE_THAN_ONE_ELEMENT","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.Blocking.cs","lineNumber":250,"sourceCode":"        {\n            return SingleOrDefault(Where(source, predicate));\n        }\n\n        [return: MaybeNull]\n        private static TSource SingleOrDefaultInternal<TSource>(IObservable<TSource> source, bool throwOnEmpty)\n        {\n            using var consumer = new SingleBlocking<TSource>();\n\n            using (source.Subscribe(consumer))\n            {\n                consumer.Wait();\n            }\n\n            consumer._error?.Throw();\n\n            if (consumer._hasMoreThanOneElement)\n            {\n                throw new InvalidOperationException(Strings_Linq.MORE_THAN_ONE_ELEMENT);\n            }\n\n            if (throwOnEmpty && !consumer._hasValue)\n            {\n                throw new InvalidOperationException(Strings_Linq.NO_ELEMENTS);\n            }\n\n            return consumer._value;\n        }\n\n        #endregion\n\n        #region Wait\n\n        public virtual TSource Wait<TSource>(IObservable<TSource> source)\n        {\n            return LastOrDefaultInternal(source, true)!;\n        }","sourceCodeStart":232,"sourceCodeEnd":268,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.Blocking.cs#L232-L268","documentation":"Blocking Single/SingleOrDefault (via SingleOrDefaultInternal) throws InvalidOperationException with Strings_Linq.MORE_THAN_ONE_ELEMENT when the queryable sequence emits two or more elements, since Single demands at most one. This check runs before the empty-sequence check.","triggerScenarios":"Calling queryable.Single() or SingleOrDefault() on an IQbservable whose source emits more than one OnNext value.","commonSituations":"Assuming a lookup by a 'unique' key returns one row but the key is not actually unique; a stream that redundantly re-emits an updated value before completing.","solutions":["Deduplicate or take the first element: .Take(1).Single()","Fix the source so it truly emits a single value","Use First()/FirstOrDefault() if multiple elements are acceptable"],"exampleFix":"// before\nvar one = queryable.Single(); // 2+ elements -> throws\n// after\nvar one = queryable.Take(1).Single();","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { var v = queryable.Single(); } catch (InvalidOperationException) { /* 0 or 2+ elements */ }","preventionTips":["Enforce uniqueness at the data source so Single is safe","Use .Take(1).Single() to tolerate extra elements","Use First()/FirstOrDefault() if multiplicity is acceptable"],"tags":["multiple-elements","blocking","rx","single"],"backgroundTag":"unexpected-response-shape","analyzedSha":"94b5d5ab912789f5abe9a72138a25bbd716fe59c","analyzedAt":"2026-09-15T02:26:24.759Z","contentChangedAt":"2026-09-15T02:26:24.759Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}