{"record":{"id":"eee038afe50ef584","repo":"dotnet/efcore","slug":"indexexpression-with-multiple-arguments","errorCode":null,"errorMessage":"IndexExpression with multiple arguments","messagePattern":"IndexExpression with multiple arguments","errorType":"exception","errorClass":"NotImplementedException","httpStatus":null,"severity":"error","filePath":"src/EFCore.Design/Query/Internal/LinqToCSharpSyntaxTranslator.cs","lineNumber":1911,"sourceCode":"                break;\n            case MethodBase method:\n                _methodUnsafeAccessors[method] = unsafeAccessorDeclaration;\n                break;\n            default:\n                throw new UnreachableException();\n        }\n\n        return unsafeAccessorDeclaration;\n    }\n\n    /// <inheritdoc />\n    protected override Expression VisitIndex(IndexExpression index)\n    {\n        using var _ = ChangeContext(ExpressionContext.Expression);\n\n        if (index.Arguments.Count > 1)\n        {\n            throw new NotImplementedException(\"IndexExpression with multiple arguments\");\n        }\n\n        Result =\n            ElementAccessExpression(Translate<ExpressionSyntax>(index.Object!))\n                .WithArgumentList(\n                    BracketedArgumentList(\n                        SingletonSeparatedList(\n                            Argument(\n                                Translate<ExpressionSyntax>(index.Arguments.Single())))));\n\n        return index;\n    }\n\n    /// <inheritdoc />\n    protected override Expression VisitMethodCall(MethodCallExpression call)\n    {\n        if (call.Method.DeclaringType is null)\n        {","sourceCodeStart":1893,"sourceCodeEnd":1929,"githubUrl":"https://github.com/dotnet/efcore/blob/3a2006ef569de08368d59db5e1468aa8f407e4f8/src/EFCore.Design/Query/Internal/LinqToCSharpSyntaxTranslator.cs#L1893-L1929","documentation":"Thrown by LinqToCSharpSyntaxTranslator.VisitIndex when an IndexExpression has more than one argument. The translator only renders single-argument element access (array[i], list[0], single-index indexer) via ElementAccessExpression with a bracketed argument list of one; multi-dimensional arrays (a[i,j]) and multi-parameter indexers are unimplemented.","triggerScenarios":"An expression tree contains an IndexExpression whose Arguments has 2+ entries — e.g. a 2D array access Expression.ArrayIndex(arr, i, j) (or Expression.Property with multiple index arguments on a multi-parameter indexer).","commonSituations":"Compiling expression trees that touch multidimensional arrays or multi-parameter indexers; provider extensions that surface multi-key lookups as index expressions; converting matrix-style data access into expression trees.","solutions":["Replace multi-argument indexing with an explicit method call to a helper that performs the lookup (the translator handles method calls).","Flatten the multidimensional array into a single-dimensional one so the single-argument path applies.","Wrap the multi-key access behind a public indexer-free API on a helper type and call it."],"exampleFix":"// before — 2D array access via IndexExpression\nvar elem = Expression.ArrayAccess(\n    matrixExpr,\n    Expression.Constant(0),\n    Expression.Constant(1)); // 2 args -> throws\n\n// after — call a helper method\nvar elem = Expression.Call(\n    matrixExpr,\n    nameof(matrix.Get),\n    Type.EmptyTypes,\n    Expression.Constant(0),\n    Expression.Constant(1));","handlingStrategy":"validation","validationCode":"// Reject multi-argument IndexExpression nodes.\nusing System.Linq.Expressions;\n\nbool HasMultiArgIndex(Expression e)\n{\n    bool bad = false;\n    new IndexChecker(i => { if (i.Arguments.Count > 1) bad = true; }).Visit(e);\n    return bad;\n}\n\nclass IndexChecker(Action<IndexExpression> onIndex) : ExpressionVisitor\n{\n    protected override Expression VisitIndex(IndexExpression i) { onIndex(i); return base.VisitIndex(i); }\n}","typeGuard":"static bool IsSingleArgIndex(IndexExpression i) => i.Arguments.Count <= 1;","tryCatchPattern":null,"preventionTips":["Replace multi-argument indexing with a helper method call the translator can render.","Flatten multidimensional arrays to single-dimensional before building the tree.","Pre-scan trees for IndexExpression nodes with more than one argument."],"tags":["ef-core","expression-trees","index-expressions","multidimensional-arrays","code-generation","csharp"],"backgroundTag":null,"analyzedSha":"3a2006ef569de08368d59db5e1468aa8f407e4f8","analyzedAt":"2026-08-11T23:42:04.146Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}