{"record":{"id":"f1c1538792d11ce6","repo":"dotnet/reactive","slug":"expression","errorCode":null,"errorMessage":"expression","messagePattern":"expression","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"Rx.NET/Source/src/System.Reactive/ObservableQuery.cs","lineNumber":25,"sourceCode":"using System.Globalization;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Reactive.Joins;\nusing System.Reactive.Linq;\nusing System.Reflection;\n\nnamespace System.Reactive\n{\n#if HAS_TRIMMABILITY_ATTRIBUTES\n    [RequiresUnreferencedCode(Constants_Core.AsQueryableTrimIncompatibilityMessage)]\n#endif\n    internal class ObservableQueryProvider : IQbservableProvider, IQueryProvider\n    {\n        public IQbservable<TResult> CreateQuery<TResult>(Expression expression)\n        {\n            if (expression == null)\n            {\n                throw new ArgumentNullException(nameof(expression));\n            }\n\n            if (!typeof(IObservable<TResult>).IsAssignableFrom(expression.Type))\n            {\n                throw new ArgumentException(Strings_Providers.INVALID_TREE_TYPE, nameof(expression));\n            }\n\n            return new ObservableQuery<TResult>(expression);\n        }\n\n        IQueryable<TElement> IQueryProvider.CreateQuery<TElement>(Expression expression)\n        {\n            //\n            // Here we're on the edge between IQbservable and IQueryable for the local\n            // execution case. E.g.:\n            //\n            //   observable.AsQbservable().<operators>.ToQueryable()\n            //","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/dotnet/reactive/blob/94b5d5ab912789f5abe9a72138a25bbd716fe59c/Rx.NET/Source/src/System.Reactive/ObservableQuery.cs#L7-L43","documentation":"ObservableQueryProvider.CreateQuery<TResult> builds an IQbservable<TResult> from an expression tree and rejects a null expression with ArgumentNullException. The provider needs a valid expression tree to represent the query being composed.","triggerScenarios":"Calling provider.CreateQuery<TResult>(null) (ObservableQuery.cs:24) — typically via IQbservableProvider/IQueryProvider plumbing when a null expression is passed down, e.g. from custom LINQ-style query composition code.","commonSituations":"Writing a custom query provider or expression visitor over IQbservable that forwards a null expression; mock/stub query providers returning expressions that are null; dynamic query building that skips expression construction.","solutions":["Pass a valid Expression (e.g. Expression.Constant(observable) typed as IObservable<TResult>) to CreateQuery","Fix the upstream query-builder so it always constructs an expression before calling CreateQuery","Null-check the expression in your composition layer before invoking the provider"],"exampleFix":"// before\nExpression expr = builder.TryBuild(); // may be null\nvar q = provider.CreateQuery<int>(expr);\n// after\nvar expr = builder.TryBuild() ?? Expression.Constant(Observable.Empty<int>());\nvar q = provider.CreateQuery<int>(expr);","handlingStrategy":"validation","validationCode":"if (expression == null) throw new InvalidOperationException(\"query expression not built\");","typeGuard":null,"tryCatchPattern":"try { provider.CreateQuery<T>(expression); } catch (ArgumentNullException ex) when (ex.ParamName == \"expression\") { /* rebuild the expression tree */ }","preventionTips":["Always build a non-null Expression before CreateQuery","Null-check results of expression builders"],"tags":["argument-null","rx","expression-tree","csharp"],"backgroundTag":"null-argument","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"}