From c8e109fb94a2f1ac802f56117f64aadff748b8cd Mon Sep 17 00:00:00 2001 From: Christopher Jolly Date: Sun, 2 Jul 2023 15:41:45 +0800 Subject: [PATCH] Jet can't candle a left join straight after a cross join. We have to push the cross join specifically down into its own subquery and then do a left join on that --- ...QueryableMethodTranslatingExpressionVisitor.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/EFCore.Jet/Query/Internal/JetQueryableMethodTranslatingExpressionVisitor.cs b/src/EFCore.Jet/Query/Internal/JetQueryableMethodTranslatingExpressionVisitor.cs index 2621d1f..cb6084c 100644 --- a/src/EFCore.Jet/Query/Internal/JetQueryableMethodTranslatingExpressionVisitor.cs +++ b/src/EFCore.Jet/Query/Internal/JetQueryableMethodTranslatingExpressionVisitor.cs @@ -1,13 +1,10 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; -using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Linq.Expressions; using Microsoft.EntityFrameworkCore.Query; using Microsoft.EntityFrameworkCore.Query.SqlExpressions; -using Microsoft.EntityFrameworkCore.Storage; namespace EntityFrameworkCore.Jet.Query.Internal; @@ -53,4 +50,16 @@ public class JetQueryableMethodTranslatingExpressionVisitor : RelationalQueryabl /// protected override QueryableMethodTranslatingExpressionVisitor CreateSubqueryVisitor() => new JetQueryableMethodTranslatingExpressionVisitor(this); + + protected override ShapedQueryExpression? TranslateLeftJoin(ShapedQueryExpression outer, ShapedQueryExpression inner, + LambdaExpression outerKeySelector, LambdaExpression innerKeySelector, LambdaExpression resultSelector) + { + //Jet can't handle a left join following a cross join + //so we push the cross join into a subquery wrapped by parentheses and then do the left join on that + if (outer.QueryExpression is SelectExpression selectExpression && selectExpression.Tables.Last() is CrossJoinExpression) + { + selectExpression.PushdownIntoSubquery(); + } + return base.TranslateLeftJoin(outer, inner, outerKeySelector, innerKeySelector, resultSelector); + } }