{"record":{"id":"5c922e93becd522c","repo":"dotnet/efcore","slug":"unsupported-linq-unary-node-unary-nodetype","errorCode":null,"errorMessage":"Unsupported LINQ unary node: {unary.NodeType}","messagePattern":"Unsupported LINQ unary node: (.+?)","errorType":"exception","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"src/EFCore.Design/Query/Internal/LinqToCSharpSyntaxTranslator.cs","lineNumber":2513,"sourceCode":"            ExpressionType.IsTrue => operand,\n            ExpressionType.ArrayLength => _g.MemberAccessExpression(operand, \"Length\"),\n            ExpressionType.Convert => ParenthesizedExpression((ExpressionSyntax)_g.ConvertExpression(Generate(unary.Type), operand)),\n            ExpressionType.ConvertChecked =>\n                ParenthesizedExpression((ExpressionSyntax)_g.ConvertExpression(Generate(unary.Type), operand)),\n            ExpressionType.Throw when unary.Type == typeof(void) => _g.ThrowStatement(operand),\n            ExpressionType.Throw => _g.ThrowExpression(operand),\n            ExpressionType.TypeAs => BinaryExpression(SyntaxKind.AsExpression, operand, Generate(unary.Type)),\n            ExpressionType.Quote => operand,\n            ExpressionType.UnaryPlus => PrefixUnaryExpression(SyntaxKind.UnaryPlusExpression, operand),\n            ExpressionType.Unbox => operand,\n            ExpressionType.Increment => Translate(Expression.Add(unary.Operand, Expression.Constant(1))),\n            ExpressionType.Decrement => Translate(Expression.Subtract(unary.Operand, Expression.Constant(1))),\n            ExpressionType.PostIncrementAssign => PostfixUnaryExpression(SyntaxKind.PostIncrementExpression, operand),\n            ExpressionType.PostDecrementAssign => PostfixUnaryExpression(SyntaxKind.PostDecrementExpression, operand),\n            ExpressionType.PreIncrementAssign => PrefixUnaryExpression(SyntaxKind.PreIncrementExpression, operand),\n            ExpressionType.PreDecrementAssign => PrefixUnaryExpression(SyntaxKind.PreDecrementExpression, operand),\n\n            _ => throw new ArgumentOutOfRangeException(\"Unsupported LINQ unary node: \" + unary.NodeType)\n        };\n\n        return unary;\n    }\n\n    /// <inheritdoc />\n    protected override Expression VisitMemberInit(MemberInitExpression memberInit)\n    {\n        var objectCreation = Translate<ObjectCreationExpressionSyntax>(memberInit.NewExpression);\n\n        List<MemberListBinding>? incompatibleListBindings = null;\n\n        var initializerExpressions = new List<AssignmentExpressionSyntax>(memberInit.Bindings.Count);\n\n        foreach (var binding in memberInit.Bindings)\n        {\n            // C# collection initialization syntax only works when Add is called on an IEnumerable, but LINQ supports arbitrary add\n            // methods. Skip these, we'll add them later outside the initializer","sourceCodeStart":2495,"sourceCodeEnd":2531,"githubUrl":"https://github.com/dotnet/efcore/blob/dbf9771522148d61a2467854921bd5dc6f6e6916/src/EFCore.Design/Query/Internal/LinqToCSharpSyntaxTranslator.cs#L2495-L2531","documentation":"The switch over unary.NodeType in VisitUnary covers Negate, Not, Convert, Throw, Quote, increment/decrement, array-length, etc. Any other ExpressionType falls through to ArgumentOutOfRangeException(\"Unsupported LINQ unary node: ...\"). It signals a unary node type the translator was never taught to render.","triggerScenarios":"A UnaryExpression whose NodeType is outside the handled set — an uncommon or newer LINQ node type reaching the translator.","commonSituations":"Expression rewriting that introduces unusual unary node types; rarely produced by ordinary user code.","solutions":["Identify the NodeType in the message and rewrite it using supported primitives (e.g. expand a custom unary into arithmetic).","Avoid unsupported unary operators in precompiled query expressions.","Report to EF Core if the node type is common and legitimately needed."],"exampleFix":"// before\nvar u = Expression.MakeUnary(obscureNodeType, operand, typeof(int));\n// after\nvar u = Expression.Add(operand, Expression.Constant(1)); // express with supported nodes","handlingStrategy":"try-catch","validationCode":"// Check the NodeType is in the supported set before translating\nstatic readonly HashSet<ExpressionType> Supported = new() {\n    ExpressionType.Negate, ExpressionType.NegateChecked, ExpressionType.Not,\n    ExpressionType.OnesComplement, ExpressionType.IsFalse, ExpressionType.IsTrue,\n    ExpressionType.ArrayLength, ExpressionType.Convert, ExpressionType.ConvertChecked,\n    ExpressionType.Throw, ExpressionType.TypeAs, ExpressionType.Quote, ExpressionType.UnaryPlus,\n    ExpressionType.Unbox, ExpressionType.Increment, ExpressionType.Decrement,\n    ExpressionType.PostIncrementAssign, ExpressionType.PostDecrementAssign,\n    ExpressionType.PreIncrementAssign, ExpressionType.PreDecrementAssign };\nbool ok = Supported.Contains(unary.NodeType);","typeGuard":"static bool IsSupportedUnary(ExpressionType t) => Supported.Contains(t);","tryCatchPattern":"try { translator.Translate(lambda); }\ncatch (ArgumentOutOfRangeException ex) when (ex.Message.Contains(\"Unsupported LINQ unary node\")) {\n    // rewrite the offending unary using supported primitives\n}","preventionTips":["Identify the NodeType in the message and rewrite with supported primitives.","Avoid obscure unary operators in precompiled queries.","Report common missing node types to EF Core."],"tags":["ef-core","linq","expression-tree","unary","operators"],"analyzedSha":"dbf9771522148d61a2467854921bd5dc6f6e6916","analyzedAt":"2026-08-06T20:46:03.226Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}