From 9fc67e29383e756d284b9ef9ca07f924e2e65a31 Mon Sep 17 00:00:00 2001 From: Arthur Vickers Date: Mon, 19 Aug 2019 12:51:41 -0700 Subject: [PATCH] Further updates to query exception throwing Fixes #16133 --- ...osmosProjectionBindingExpressionVisitor.cs | 2 +- ...yableMethodTranslatingExpressionVisitor.cs | 3 +- .../Query/SqlExpressionFactory.cs | 8 +- src/EFCore/Properties/CoreStrings.Designer.cs | 8 + src/EFCore/Properties/CoreStrings.resx | 3 + ...ntityEqualityRewritingExpressionVisitor.cs | 4 +- .../GroupJoinFlatteningExpressionVisitor.cs | 26 +--- .../NavigationExpandingExpressionVisitor.cs | 6 +- ...yableMethodTranslatingExpressionVisitor.cs | 143 ++++++++++-------- .../Query/QueryNoClientEvalTestBase.cs | 30 ++-- .../Query/GearsOfWarQueryTestBase.cs | 8 +- .../SimpleQueryTestBase.ResultOperators.cs | 4 +- .../Query/SimpleQueryTestBase.cs | 6 +- .../Query/GearsOfWarQuerySqliteTest.cs | 60 ++++---- 14 files changed, 161 insertions(+), 150 deletions(-) diff --git a/src/EFCore.Cosmos/Query/Internal/CosmosProjectionBindingExpressionVisitor.cs b/src/EFCore.Cosmos/Query/Internal/CosmosProjectionBindingExpressionVisitor.cs index 917dea49d21..46c7a1f1f3b 100644 --- a/src/EFCore.Cosmos/Query/Internal/CosmosProjectionBindingExpressionVisitor.cs +++ b/src/EFCore.Cosmos/Query/Internal/CosmosProjectionBindingExpressionVisitor.cs @@ -381,7 +381,7 @@ protected override Expression VisitExtension(Expression extensionExpression) return _clientEval ? base.VisitExtension(includeExpression) : null; default: - throw new InvalidOperationException(CoreStrings.TranslationFailed(extensionExpression.Print())); + throw new InvalidOperationException(CoreStrings.QueryFailed(extensionExpression.Print(), GetType().Name)); } } diff --git a/src/EFCore.Cosmos/Query/Internal/CosmosQueryableMethodTranslatingExpressionVisitor.cs b/src/EFCore.Cosmos/Query/Internal/CosmosQueryableMethodTranslatingExpressionVisitor.cs index fe34ce0ac8f..0541f7de57e 100644 --- a/src/EFCore.Cosmos/Query/Internal/CosmosQueryableMethodTranslatingExpressionVisitor.cs +++ b/src/EFCore.Cosmos/Query/Internal/CosmosQueryableMethodTranslatingExpressionVisitor.cs @@ -302,8 +302,7 @@ protected override ShapedQueryExpression TranslateGroupBy(ShapedQueryExpression /// protected override ShapedQueryExpression TranslateGroupJoin(ShapedQueryExpression outer, ShapedQueryExpression inner, LambdaExpression outerKeySelector, LambdaExpression innerKeySelector, LambdaExpression resultSelector) { - throw new InvalidOperationException(CoreStrings.TranslationFailed( - outerKeySelector.Print() + "; " + innerKeySelector.Print() + "; " + resultSelector.Print())); + return null; } /// diff --git a/src/EFCore.Relational/Query/SqlExpressionFactory.cs b/src/EFCore.Relational/Query/SqlExpressionFactory.cs index 19543de6db9..f6bf8182872 100644 --- a/src/EFCore.Relational/Query/SqlExpressionFactory.cs +++ b/src/EFCore.Relational/Query/SqlExpressionFactory.cs @@ -109,7 +109,8 @@ private SqlExpression ApplyTypeMappingOnSqlUnary( break; default: - throw new InvalidOperationException(CoreStrings.TranslationFailed(sqlUnaryExpression.Print())); + throw new InvalidOperationException( + $"The unary expression operator type {sqlUnaryExpression.OperatorType} is not supported."); } return new SqlUnaryExpression( @@ -397,11 +398,12 @@ public virtual InExpression In(SqlExpression item, SqlExpression values, bool ne public virtual InExpression In(SqlExpression item, SelectExpression subquery, bool negated) { - var typeMapping = subquery.Projection.Single().Expression.TypeMapping; + var sqlExpression = subquery.Projection.Single().Expression; + var typeMapping = sqlExpression.TypeMapping; if (typeMapping == null) { - throw new InvalidOperationException(CoreStrings.TranslationFailed(item.Print())); + throw new InvalidOperationException($"The subquery '{subquery.Print()}' references type '{sqlExpression.Type}' for which no type mapping could be found."); } item = ApplyTypeMapping(item, typeMapping); diff --git a/src/EFCore/Properties/CoreStrings.Designer.cs b/src/EFCore/Properties/CoreStrings.Designer.cs index 78537b583bd..bb9b4496ab9 100644 --- a/src/EFCore/Properties/CoreStrings.Designer.cs +++ b/src/EFCore/Properties/CoreStrings.Designer.cs @@ -40,6 +40,14 @@ public static string TranslationFailed([CanBeNull] object expression) GetString("TranslationFailed", nameof(expression)), expression); + /// + /// Processing of the LINQ expression '{expression}' by '{visitor}' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information. + /// + public static string QueryFailed([CanBeNull] object expression, [CanBeNull] object visitor) + => string.Format( + GetString("QueryFailed", nameof(expression), nameof(visitor)), + expression, visitor); + /// /// The model must be finalized before '{method}' can be used. Ensure that either 'OnModelCreating' has completed or, if using a stand-alone 'ModelBuilder', that 'FinalizeModel' has been called. /// diff --git a/src/EFCore/Properties/CoreStrings.resx b/src/EFCore/Properties/CoreStrings.resx index 36dc35eb19f..2528eba7177 100644 --- a/src/EFCore/Properties/CoreStrings.resx +++ b/src/EFCore/Properties/CoreStrings.resx @@ -123,6 +123,9 @@ The LINQ expression '{expression}' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information. + + Processing of the LINQ expression '{expression}' by '{visitor}' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information. + The model must be finalized before '{method}' can be used. Ensure that either 'OnModelCreating' has completed or, if using a stand-alone 'ModelBuilder', that 'FinalizeModel' has been called. diff --git a/src/EFCore/Query/Internal/EntityEqualityRewritingExpressionVisitor.cs b/src/EFCore/Query/Internal/EntityEqualityRewritingExpressionVisitor.cs index 5dce1878eb1..bd2e15b116e 100644 --- a/src/EFCore/Query/Internal/EntityEqualityRewritingExpressionVisitor.cs +++ b/src/EFCore/Query/Internal/EntityEqualityRewritingExpressionVisitor.cs @@ -530,7 +530,7 @@ protected virtual Expression VisitSelectMethodCall(MethodCallExpression methodCa ? methodCallExpression.Update(null, new[] { newSource, Unwrap(Visit(arguments[1])) }) : arguments.Count == 3 ? methodCallExpression.Update(null, new[] { newSource, Unwrap(Visit(arguments[1])), Unwrap(Visit(arguments[2])) }) - : throw new InvalidOperationException(CoreStrings.TranslationFailed(methodCallExpression.Print())); + : throw new InvalidOperationException(CoreStrings.QueryFailed(methodCallExpression.Print(), GetType().Name)); } MethodCallExpression newMethodCall; @@ -562,7 +562,7 @@ protected virtual Expression VisitSelectMethodCall(MethodCallExpression methodCa : (Expression)newMethodCall; } - throw new InvalidOperationException(CoreStrings.TranslationFailed(methodCallExpression.Print())); + throw new InvalidOperationException(CoreStrings.QueryFailed(methodCallExpression.Print(), GetType().Name)); } protected virtual Expression VisitJoinMethodCall(MethodCallExpression methodCallExpression) diff --git a/src/EFCore/Query/Internal/GroupJoinFlatteningExpressionVisitor.cs b/src/EFCore/Query/Internal/GroupJoinFlatteningExpressionVisitor.cs index 0267870063e..23fd05a7efd 100644 --- a/src/EFCore/Query/Internal/GroupJoinFlatteningExpressionVisitor.cs +++ b/src/EFCore/Query/Internal/GroupJoinFlatteningExpressionVisitor.cs @@ -183,31 +183,7 @@ protected override Expression VisitMethodCall(MethodCallExpression methodCallExp .VerifyCollectionSelector( groupJoinResultSelectorBody, groupJoinResultSelector.Parameters[1]); - if (correlatedCollectionSelector) - { - // See #17236 - throw new InvalidOperationException(CoreStrings.TranslationFailed( - outerKeySelector.Print() + "; " + innerKeySelector.Print() + "; " + groupJoinResultSelector.Print())); - - //var outerParameter = outerKeySelector.Parameters[0]; - //var innerParameter = innerKeySelector.Parameters[0]; - //var correlationPredicate = Expression.Equal( - // outerKeySelector.Body, - // innerKeySelector.Body); - - //inner = Expression.Call( - // _whereMethodInfo.MakeGenericMethod(inner.Type.TryGetSequenceType()), - // inner, - // Expression.Quote(Expression.Lambda(correlationPredicate, innerParameter))); - - //inner = ReplacingExpressionVisitor.Replace( - // groupJoinResultSelector.Parameters[1], - // inner, - // groupJoinResultSelectorBody); - - //inner = Expression.Quote(Expression.Lambda(inner, outerParameter)); - } - else + if (!correlatedCollectionSelector) { inner = ReplacingExpressionVisitor.Replace( groupJoinResultSelector.Parameters[1], diff --git a/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.cs b/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.cs index 73bfb4ecf6e..e84be40ebe9 100644 --- a/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.cs +++ b/src/EFCore/Query/Internal/NavigationExpandingExpressionVisitor.cs @@ -511,7 +511,7 @@ when QueryableMethods.IsSumWithSelector(method): return ProcessDefaultIfEmpty(source); default: - throw new InvalidOperationException(CoreStrings.TranslationFailed(methodCallExpression.Print())); + throw new InvalidOperationException(CoreStrings.QueryFailed(methodCallExpression.Print(), GetType().Name)); } } else if (firstArgument is MaterializeCollectionNavigationExpression materializeCollectionNavigationExpression @@ -536,7 +536,7 @@ when QueryableMethods.IsSumWithSelector(method): return new NavigationExpansionExpression(methodCallExpression, currentTree, currentTree, parameterName); } - throw new InvalidOperationException(CoreStrings.TranslationFailed(methodCallExpression.Print())); + throw new InvalidOperationException(CoreStrings.QueryFailed(methodCallExpression.Print(), GetType().Name)); } if (method.IsGenericMethod @@ -797,7 +797,7 @@ private Expression ProcessSelectMany( return new NavigationExpansionExpression(newSource, currentTree, pendingSelector, parameterName); } - throw new InvalidOperationException(CoreStrings.TranslationFailed(collectionSelector.Print())); + throw new InvalidOperationException(CoreStrings.QueryFailed(collectionSelector.Print(), GetType().Name)); } private void ApplyPendingOrderings(NavigationExpansionExpression source) diff --git a/src/EFCore/Query/QueryableMethodTranslatingExpressionVisitor.cs b/src/EFCore/Query/QueryableMethodTranslatingExpressionVisitor.cs index af3a92b0b94..86d33541043 100644 --- a/src/EFCore/Query/QueryableMethodTranslatingExpressionVisitor.cs +++ b/src/EFCore/Query/QueryableMethodTranslatingExpressionVisitor.cs @@ -6,6 +6,8 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Internal; namespace Microsoft.EntityFrameworkCore.Query @@ -33,6 +35,17 @@ protected override Expression VisitConstant(ConstantExpression constantExpressio protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression) { + ShapedQueryExpression CheckTranslated(ShapedQueryExpression translated) + { + if (translated == null) + { + throw new InvalidOperationException( + CoreStrings.TranslationFailed(methodCallExpression.Print())); + } + + return translated; + } + var method = methodCallExpression.Method; if (method.DeclaringType == typeof(Queryable) || method.DeclaringType == typeof(QueryableExtensions)) { @@ -45,17 +58,17 @@ protected override Expression VisitMethodCall(MethodCallExpression methodCallExp case nameof(Queryable.All) when genericMethod == QueryableMethods.All: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateAll(shapedQueryExpression, GetLambdaExpressionFromArgument(1)); + return CheckTranslated(TranslateAll(shapedQueryExpression, GetLambdaExpressionFromArgument(1))); case nameof(Queryable.Any) when genericMethod == QueryableMethods.AnyWithoutPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateAny(shapedQueryExpression, null); + return CheckTranslated(TranslateAny(shapedQueryExpression, null)); case nameof(Queryable.Any) when genericMethod == QueryableMethods.AnyWithPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateAny(shapedQueryExpression, GetLambdaExpressionFromArgument(1)); + return CheckTranslated(TranslateAny(shapedQueryExpression, GetLambdaExpressionFromArgument(1))); case nameof(Queryable.AsQueryable) when genericMethod == QueryableMethods.AsQueryable: @@ -64,16 +77,16 @@ protected override Expression VisitMethodCall(MethodCallExpression methodCallExp case nameof(Queryable.Average) when QueryableMethods.IsAverageWithoutSelector(method): shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateAverage(shapedQueryExpression, null, methodCallExpression.Type); + return CheckTranslated(TranslateAverage(shapedQueryExpression, null, methodCallExpression.Type)); case nameof(Queryable.Average) when QueryableMethods.IsAverageWithSelector(method): shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateAverage(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type); + return CheckTranslated(TranslateAverage(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type)); case nameof(Queryable.Cast) when genericMethod == QueryableMethods.Cast: - return TranslateCast(shapedQueryExpression, method.GetGenericArguments()[0]); + return CheckTranslated(TranslateCast(shapedQueryExpression, method.GetGenericArguments()[0])); case nameof(Queryable.Concat) when genericMethod == QueryableMethods.Concat: @@ -91,39 +104,39 @@ when QueryableMethods.IsAverageWithSelector(method): case nameof(Queryable.Contains) when genericMethod == QueryableMethods.Contains: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateContains(shapedQueryExpression, methodCallExpression.Arguments[1]); + return CheckTranslated(TranslateContains(shapedQueryExpression, methodCallExpression.Arguments[1])); case nameof(Queryable.Count) when genericMethod == QueryableMethods.CountWithoutPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateCount(shapedQueryExpression, null); + return CheckTranslated(TranslateCount(shapedQueryExpression, null)); case nameof(Queryable.Count) when genericMethod == QueryableMethods.CountWithPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateCount(shapedQueryExpression, GetLambdaExpressionFromArgument(1)); + return CheckTranslated(TranslateCount(shapedQueryExpression, GetLambdaExpressionFromArgument(1))); case nameof(Queryable.DefaultIfEmpty) when genericMethod == QueryableMethods.DefaultIfEmptyWithoutArgument: - return TranslateDefaultIfEmpty(shapedQueryExpression, null); + return CheckTranslated(TranslateDefaultIfEmpty(shapedQueryExpression, null)); case nameof(Queryable.DefaultIfEmpty) when genericMethod == QueryableMethods.DefaultIfEmptyWithArgument: - return TranslateDefaultIfEmpty(shapedQueryExpression, methodCallExpression.Arguments[1]); + return CheckTranslated(TranslateDefaultIfEmpty(shapedQueryExpression, methodCallExpression.Arguments[1])); case nameof(Queryable.Distinct) when genericMethod == QueryableMethods.Distinct: - return TranslateDistinct(shapedQueryExpression); + return CheckTranslated(TranslateDistinct(shapedQueryExpression)); case nameof(Queryable.ElementAt) when genericMethod == QueryableMethods.ElementAt: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateElementAtOrDefault(shapedQueryExpression, methodCallExpression.Arguments[1], false); + return CheckTranslated(TranslateElementAtOrDefault(shapedQueryExpression, methodCallExpression.Arguments[1], false)); case nameof(Queryable.ElementAtOrDefault) when genericMethod == QueryableMethods.ElementAtOrDefault: shapedQueryExpression.ResultCardinality = ResultCardinality.SingleOrDefault; - return TranslateElementAtOrDefault(shapedQueryExpression, methodCallExpression.Arguments[1], true); + return CheckTranslated(TranslateElementAtOrDefault(shapedQueryExpression, methodCallExpression.Arguments[1], true)); case nameof(Queryable.Except) when genericMethod == QueryableMethods.Except: @@ -131,9 +144,9 @@ when QueryableMethods.IsAverageWithSelector(method): var source2 = Visit(methodCallExpression.Arguments[1]); if (source2 is ShapedQueryExpression innerShapedQueryExpression) { - return TranslateExcept( + return CheckTranslated(TranslateExcept( shapedQueryExpression, - innerShapedQueryExpression); + innerShapedQueryExpression)); } break; } @@ -141,45 +154,51 @@ when QueryableMethods.IsAverageWithSelector(method): case nameof(Queryable.First) when genericMethod == QueryableMethods.FirstWithoutPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateFirstOrDefault(shapedQueryExpression, null, methodCallExpression.Type, false); + return CheckTranslated(TranslateFirstOrDefault(shapedQueryExpression, null, methodCallExpression.Type, false)); case nameof(Queryable.First) when genericMethod == QueryableMethods.FirstWithPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateFirstOrDefault(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, false); + return CheckTranslated(TranslateFirstOrDefault(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, false)); case nameof(Queryable.FirstOrDefault) when genericMethod == QueryableMethods.FirstOrDefaultWithoutPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.SingleOrDefault; - return TranslateFirstOrDefault(shapedQueryExpression, null, methodCallExpression.Type, true); + return CheckTranslated(TranslateFirstOrDefault(shapedQueryExpression, null, methodCallExpression.Type, true)); case nameof(Queryable.FirstOrDefault) when genericMethod == QueryableMethods.FirstOrDefaultWithPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.SingleOrDefault; - return TranslateFirstOrDefault(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, true); + return CheckTranslated(TranslateFirstOrDefault(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, true)); case nameof(Queryable.GroupBy) - when genericMethod == QueryableMethods.GroupByWithKeySelector: - return TranslateGroupBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), null, null); + when genericMethod == QueryableMethods.GroupByWithKeySelector: + return CheckTranslated(TranslateGroupBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), null, null)); case nameof(Queryable.GroupBy) - when genericMethod == QueryableMethods.GroupByWithKeyElementSelector: - return TranslateGroupBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), GetLambdaExpressionFromArgument(2), null); + when genericMethod == QueryableMethods.GroupByWithKeyElementSelector: + return CheckTranslated(TranslateGroupBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), GetLambdaExpressionFromArgument(2), null)); case nameof(Queryable.GroupBy) when genericMethod == QueryableMethods.GroupByWithKeyElementResultSelector: - return TranslateGroupBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), GetLambdaExpressionFromArgument(2), GetLambdaExpressionFromArgument(3)); + return CheckTranslated(TranslateGroupBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), GetLambdaExpressionFromArgument(2), GetLambdaExpressionFromArgument(3))); case nameof(Queryable.GroupBy) when genericMethod == QueryableMethods.GroupByWithKeyResultSelector: - return TranslateGroupBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), null, GetLambdaExpressionFromArgument(2)); + return CheckTranslated(TranslateGroupBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), null, GetLambdaExpressionFromArgument(2))); case nameof(Queryable.GroupJoin) when genericMethod == QueryableMethods.GroupJoin: { if (Visit(methodCallExpression.Arguments[1]) is ShapedQueryExpression innerShapedQueryExpression) { - return TranslateGroupJoin(shapedQueryExpression, innerShapedQueryExpression, GetLambdaExpressionFromArgument(2), GetLambdaExpressionFromArgument(3), GetLambdaExpressionFromArgument(4)); + return CheckTranslated( + TranslateGroupJoin( + shapedQueryExpression, + innerShapedQueryExpression, + GetLambdaExpressionFromArgument(2), + GetLambdaExpressionFromArgument(3), + GetLambdaExpressionFromArgument(4))); } break; } @@ -189,9 +208,7 @@ when QueryableMethods.IsAverageWithSelector(method): { if (Visit(methodCallExpression.Arguments[1]) is ShapedQueryExpression innerShapedQueryExpression) { - return TranslateIntersect( - shapedQueryExpression, - innerShapedQueryExpression); + return CheckTranslated(TranslateIntersect(shapedQueryExpression, innerShapedQueryExpression)); } break; } @@ -201,7 +218,7 @@ when QueryableMethods.IsAverageWithSelector(method): { if (Visit(methodCallExpression.Arguments[1]) is ShapedQueryExpression innerShapedQueryExpression) { - return TranslateJoin(shapedQueryExpression, innerShapedQueryExpression, GetLambdaExpressionFromArgument(2), GetLambdaExpressionFromArgument(3), GetLambdaExpressionFromArgument(4)); + return CheckTranslated(TranslateJoin(shapedQueryExpression, innerShapedQueryExpression, GetLambdaExpressionFromArgument(2), GetLambdaExpressionFromArgument(3), GetLambdaExpressionFromArgument(4))); } break; } @@ -211,7 +228,7 @@ when QueryableMethods.IsAverageWithSelector(method): { if (Visit(methodCallExpression.Arguments[1]) is ShapedQueryExpression innerShapedQueryExpression) { - return TranslateLeftJoin(shapedQueryExpression, innerShapedQueryExpression, GetLambdaExpressionFromArgument(2), GetLambdaExpressionFromArgument(3), GetLambdaExpressionFromArgument(4)); + return CheckTranslated(TranslateLeftJoin(shapedQueryExpression, innerShapedQueryExpression, GetLambdaExpressionFromArgument(2), GetLambdaExpressionFromArgument(3), GetLambdaExpressionFromArgument(4))); } break; } @@ -219,148 +236,148 @@ when QueryableMethods.IsAverageWithSelector(method): case nameof(Queryable.Last) when genericMethod == QueryableMethods.LastWithoutPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateLastOrDefault(shapedQueryExpression, null, methodCallExpression.Type, false); + return CheckTranslated(TranslateLastOrDefault(shapedQueryExpression, null, methodCallExpression.Type, false)); case nameof(Queryable.Last) when genericMethod == QueryableMethods.LastWithPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateLastOrDefault(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, false); + return CheckTranslated(TranslateLastOrDefault(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, false)); case nameof(Queryable.LastOrDefault) when genericMethod == QueryableMethods.LastOrDefaultWithoutPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.SingleOrDefault; - return TranslateLastOrDefault(shapedQueryExpression, null, methodCallExpression.Type, true); + return CheckTranslated(TranslateLastOrDefault(shapedQueryExpression, null, methodCallExpression.Type, true)); case nameof(Queryable.LastOrDefault) when genericMethod == QueryableMethods.LastOrDefaultWithPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.SingleOrDefault; - return TranslateLastOrDefault(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, true); + return CheckTranslated(TranslateLastOrDefault(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, true)); case nameof(Queryable.LongCount) when genericMethod == QueryableMethods.LongCountWithoutPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateLongCount(shapedQueryExpression, null); + return CheckTranslated(TranslateLongCount(shapedQueryExpression, null)); case nameof(Queryable.LongCount) when genericMethod == QueryableMethods.LongCountWithPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateLongCount(shapedQueryExpression, GetLambdaExpressionFromArgument(1)); + return CheckTranslated(TranslateLongCount(shapedQueryExpression, GetLambdaExpressionFromArgument(1))); case nameof(Queryable.Max) when genericMethod == QueryableMethods.MaxWithoutSelector: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateMax(shapedQueryExpression, null, methodCallExpression.Type); + return CheckTranslated(TranslateMax(shapedQueryExpression, null, methodCallExpression.Type)); case nameof(Queryable.Max) when genericMethod == QueryableMethods.MaxWithSelector: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateMax(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type); + return CheckTranslated(TranslateMax(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type)); case nameof(Queryable.Min) when genericMethod == QueryableMethods.MinWithoutSelector: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateMin(shapedQueryExpression, null, methodCallExpression.Type); + return CheckTranslated(TranslateMin(shapedQueryExpression, null, methodCallExpression.Type)); case nameof(Queryable.Min) when genericMethod == QueryableMethods.MinWithSelector: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateMin(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type); + return CheckTranslated(TranslateMin(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type)); case nameof(Queryable.OfType) when genericMethod == QueryableMethods.OfType: - return TranslateOfType(shapedQueryExpression, method.GetGenericArguments()[0]); + return CheckTranslated(TranslateOfType(shapedQueryExpression, method.GetGenericArguments()[0])); case nameof(Queryable.OrderBy) when genericMethod == QueryableMethods.OrderBy: - return TranslateOrderBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), true); + return CheckTranslated(TranslateOrderBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), true)); case nameof(Queryable.OrderByDescending) when genericMethod == QueryableMethods.OrderByDescending: - return TranslateOrderBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), false); + return CheckTranslated(TranslateOrderBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), false)); case nameof(Queryable.Reverse) when genericMethod == QueryableMethods.Reverse: - return TranslateReverse(shapedQueryExpression); + return CheckTranslated(TranslateReverse(shapedQueryExpression)); case nameof(Queryable.Select) when genericMethod == QueryableMethods.Select: - return TranslateSelect(shapedQueryExpression, GetLambdaExpressionFromArgument(1)); + return CheckTranslated(TranslateSelect(shapedQueryExpression, GetLambdaExpressionFromArgument(1))); case nameof(Queryable.SelectMany) when genericMethod == QueryableMethods.SelectManyWithoutCollectionSelector: - return TranslateSelectMany(shapedQueryExpression, GetLambdaExpressionFromArgument(1)); + return CheckTranslated(TranslateSelectMany(shapedQueryExpression, GetLambdaExpressionFromArgument(1))); case nameof(Queryable.SelectMany) when genericMethod == QueryableMethods.SelectManyWithCollectionSelector: - return TranslateSelectMany(shapedQueryExpression, GetLambdaExpressionFromArgument(1), GetLambdaExpressionFromArgument(2)); + return CheckTranslated(TranslateSelectMany(shapedQueryExpression, GetLambdaExpressionFromArgument(1), GetLambdaExpressionFromArgument(2))); case nameof(Queryable.Single) when genericMethod == QueryableMethods.SingleWithoutPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateSingleOrDefault(shapedQueryExpression, null, methodCallExpression.Type, false); + return CheckTranslated(TranslateSingleOrDefault(shapedQueryExpression, null, methodCallExpression.Type, false)); case nameof(Queryable.Single) when genericMethod == QueryableMethods.SingleWithPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateSingleOrDefault(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, false); + return CheckTranslated(TranslateSingleOrDefault(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, false)); case nameof(Queryable.SingleOrDefault) when genericMethod == QueryableMethods.SingleOrDefaultWithoutPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.SingleOrDefault; - return TranslateSingleOrDefault(shapedQueryExpression, null, methodCallExpression.Type, true); + return CheckTranslated(TranslateSingleOrDefault(shapedQueryExpression, null, methodCallExpression.Type, true)); case nameof(Queryable.SingleOrDefault) when genericMethod == QueryableMethods.SingleOrDefaultWithPredicate: shapedQueryExpression.ResultCardinality = ResultCardinality.SingleOrDefault; - return TranslateSingleOrDefault(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, true); + return CheckTranslated(TranslateSingleOrDefault(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type, true)); case nameof(Queryable.Skip) when genericMethod == QueryableMethods.Skip: - return TranslateSkip(shapedQueryExpression, methodCallExpression.Arguments[1]); + return CheckTranslated(TranslateSkip(shapedQueryExpression, methodCallExpression.Arguments[1])); case nameof(Queryable.SkipWhile) when genericMethod == QueryableMethods.SkipWhile: - return TranslateSkipWhile(shapedQueryExpression, GetLambdaExpressionFromArgument(1)); + return CheckTranslated(TranslateSkipWhile(shapedQueryExpression, GetLambdaExpressionFromArgument(1))); case nameof(Queryable.Sum) when QueryableMethods.IsSumWithoutSelector(method): shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateSum(shapedQueryExpression, null, methodCallExpression.Type); + return CheckTranslated(TranslateSum(shapedQueryExpression, null, methodCallExpression.Type)); case nameof(Queryable.Sum) when QueryableMethods.IsSumWithSelector(method): shapedQueryExpression.ResultCardinality = ResultCardinality.Single; - return TranslateSum(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type); + return CheckTranslated(TranslateSum(shapedQueryExpression, GetLambdaExpressionFromArgument(1), methodCallExpression.Type)); case nameof(Queryable.Take) when genericMethod == QueryableMethods.Take: - return TranslateTake(shapedQueryExpression, methodCallExpression.Arguments[1]); + return CheckTranslated(TranslateTake(shapedQueryExpression, methodCallExpression.Arguments[1])); case nameof(Queryable.TakeWhile) when genericMethod == QueryableMethods.TakeWhile: - return TranslateTakeWhile(shapedQueryExpression, GetLambdaExpressionFromArgument(1)); + return CheckTranslated(TranslateTakeWhile(shapedQueryExpression, GetLambdaExpressionFromArgument(1))); case nameof(Queryable.ThenBy) when genericMethod == QueryableMethods.ThenBy: - return TranslateThenBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), true); + return CheckTranslated(TranslateThenBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), true)); case nameof(Queryable.ThenByDescending) when genericMethod == QueryableMethods.ThenByDescending: - return TranslateThenBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), false); + return CheckTranslated(TranslateThenBy(shapedQueryExpression, GetLambdaExpressionFromArgument(1), false)); case nameof(Queryable.Union) when genericMethod == QueryableMethods.Union: { if (Visit(methodCallExpression.Arguments[1]) is ShapedQueryExpression innerShapedQueryExpression) { - return TranslateUnion(shapedQueryExpression, innerShapedQueryExpression); + return CheckTranslated(TranslateUnion(shapedQueryExpression, innerShapedQueryExpression)); } break; } case nameof(Queryable.Where) when genericMethod == QueryableMethods.Where: - return TranslateWhere(shapedQueryExpression, GetLambdaExpressionFromArgument(1)); + return CheckTranslated(TranslateWhere(shapedQueryExpression, GetLambdaExpressionFromArgument(1))); LambdaExpression GetLambdaExpressionFromArgument(int argumentIndex) => methodCallExpression.Arguments[argumentIndex].UnwrapLambdaFromQuote(); } diff --git a/test/EFCore.Relational.Specification.Tests/Query/QueryNoClientEvalTestBase.cs b/test/EFCore.Relational.Specification.Tests/Query/QueryNoClientEvalTestBase.cs index 9bb9fb1838f..dc7e8520d14 100644 --- a/test/EFCore.Relational.Specification.Tests/Query/QueryNoClientEvalTestBase.cs +++ b/test/EFCore.Relational.Specification.Tests/Query/QueryNoClientEvalTestBase.cs @@ -28,7 +28,7 @@ public virtual void Throws_when_where() Assert.Equal( CoreStrings.TranslationFailed("(c) => c.IsLondon"), Assert.Throws( - () => context.Customers.Where((c) => c.IsLondon).ToList()) + () => context.Customers.Where(c => c.IsLondon).ToList()) .Message); } } @@ -41,7 +41,7 @@ public virtual void Throws_when_orderby() Assert.Equal( CoreStrings.TranslationFailed("(c) => c.IsLondon"), Assert.Throws( - () => context.Customers.OrderBy((c) => c.IsLondon).ToList()).Message); + () => context.Customers.OrderBy(c => c.IsLondon).ToList()).Message); } } @@ -54,7 +54,7 @@ public virtual void Throws_when_orderby_multiple() CoreStrings.TranslationFailed("(c) => c.IsLondon"), Assert.Throws( () => context.Customers - .OrderBy((c) => c.IsLondon) + .OrderBy(c => c.IsLondon) .ThenBy(c => ClientMethod(c)) .ToList()).Message); } @@ -88,7 +88,7 @@ public virtual void Throws_when_all() Assert.Equal( CoreStrings.TranslationFailed("(c) => c.IsLondon"), Assert.Throws( - () => context.Customers.All((c) => c.IsLondon)).Message); + () => context.Customers.All(c => c.IsLondon)).Message); } } @@ -102,7 +102,7 @@ public virtual void Throws_when_from_sql_composed() Assert.Throws( () => context.Customers .FromSqlRaw(NormalizeDelimetersInRawString("select * from [Customers]")) - .Where((c) => c.IsLondon) + .Where(c => c.IsLondon) .ToList()).Message); } } @@ -131,7 +131,7 @@ public virtual void Throws_when_subquery_main_from_clause() Assert.Throws( () => (from c1 in context.Customers - .Where((c) => c.IsLondon) + .Where(c => c.IsLondon) .OrderBy(c => c.CustomerID) .Take(5) select c1) @@ -145,7 +145,7 @@ public virtual void Throws_when_select_many() using (var context = CreateContext()) { Assert.Equal( - CoreStrings.TranslationFailed("(c1) => int[] { 1, 2, 3, }"), + CoreStrings.QueryFailed("(c1) => int[] { 1, 2, 3, }", "NavigationExpandingExpressionVisitor"), Assert.Throws( () => (from c1 in context.Customers @@ -164,8 +164,8 @@ public virtual void Throws_when_join() using (var context = CreateContext()) { Assert.Equal( - CoreStrings.TranslationFailed( - @"Join( outer: DbSet, inner: (Unhandled parameter: __p_0), outerKeySelector: (e1) => e1.EmployeeID, innerKeySelector: (i) => i, resultSelector: (e1, i) => e1)"), + CoreStrings.QueryFailed( + @"Join( outer: DbSet, inner: (Unhandled parameter: __p_0), outerKeySelector: (e1) => e1.EmployeeID, innerKeySelector: (i) => i, resultSelector: (e1, i) => e1)", "NavigationExpandingExpressionVisitor"), RemoveNewLines( Assert.Throws( () => @@ -185,8 +185,8 @@ public virtual void Throws_when_group_join() using (var context = CreateContext()) { Assert.Equal( - CoreStrings.TranslationFailed( - "GroupJoin( outer: DbSet, inner: (Unhandled parameter: __p_0), outerKeySelector: (e1) => e1.EmployeeID, innerKeySelector: (i) => i, resultSelector: (e1, g) => e1)"), + CoreStrings.QueryFailed( + "GroupJoin( outer: DbSet, inner: (Unhandled parameter: __p_0), outerKeySelector: (e1) => e1.EmployeeID, innerKeySelector: (i) => i, resultSelector: (e1, g) => e1)", "NavigationExpandingExpressionVisitor"), RemoveNewLines( Assert.Throws( () => @@ -225,7 +225,7 @@ public virtual void Throws_when_first() Assert.Equal( CoreStrings.TranslationFailed("(c) => c.IsLondon"), Assert.Throws( - () => context.Customers.First((c) => c.IsLondon)).Message); + () => context.Customers.First(c => c.IsLondon)).Message); } } @@ -237,7 +237,7 @@ public virtual void Throws_when_single() Assert.Equal( CoreStrings.TranslationFailed("(c) => c.IsLondon"), Assert.Throws( - () => context.Customers.Single((c) => c.IsLondon)).Message); + () => context.Customers.Single(c => c.IsLondon)).Message); } } @@ -249,7 +249,7 @@ public virtual void Throws_when_first_or_default() Assert.Equal( CoreStrings.TranslationFailed("(c) => c.IsLondon"), Assert.Throws( - () => context.Customers.FirstOrDefault((c) => c.IsLondon)).Message); + () => context.Customers.FirstOrDefault(c => c.IsLondon)).Message); } } @@ -261,7 +261,7 @@ public virtual void Throws_when_single_or_default() Assert.Equal( CoreStrings.TranslationFailed("(c) => c.IsLondon"), Assert.Throws( - () => context.Customers.SingleOrDefault((c) => c.IsLondon)).Message); + () => context.Customers.SingleOrDefault(c => c.IsLondon)).Message); } } diff --git a/test/EFCore.Specification.Tests/Query/GearsOfWarQueryTestBase.cs b/test/EFCore.Specification.Tests/Query/GearsOfWarQueryTestBase.cs index 63c74a6e74e..5a6ad1b151d 100644 --- a/test/EFCore.Specification.Tests/Query/GearsOfWarQueryTestBase.cs +++ b/test/EFCore.Specification.Tests/Query/GearsOfWarQueryTestBase.cs @@ -1744,8 +1744,8 @@ public virtual async Task Select_navigation_with_concat_and_count(bool isAsync) gs => gs.Where(g => !g.HasSoulPatch).Select(g => g.Weapons.Concat(g.Weapons).Count())))).Message; Assert.Equal( - CoreStrings.TranslationFailed("Concat( source1: AsQueryable(MaterializeCollectionNavigation(Navigation: Gear.Weapons (k__BackingField, ICollection) Collection ToDependent Weapon Inverse: Owner, Where( source: NavigationExpansionExpression Source: Where( source: DbSet, predicate: (w) => Property((Unhandled parameter: g), \"FullName\") == Property(w, \"OwnerFullName\")) PendingSelector: (w) => NavigationTreeExpression Value: EntityReferenceWeapon Expression: w , predicate: (i) => Property(NavigationTreeExpression Value: EntityReferenceGear Expression: (Unhandled parameter: g), \"FullName\") == Property(i, \"OwnerFullName\")))), source2: MaterializeCollectionNavigation(Navigation: Gear.Weapons (k__BackingField, ICollection) Collection ToDependent Weapon Inverse: Owner, Where( source: NavigationExpansionExpression Source: Where( source: DbSet, predicate: (w0) => Property((Unhandled parameter: g), \"FullName\") == Property(w0, \"OwnerFullName\")) PendingSelector: (w0) => NavigationTreeExpression Value: EntityReferenceWeapon Expression: w0 , predicate: (i) => Property(NavigationTreeExpression Value: EntityReferenceGear Expression: (Unhandled parameter: g), \"FullName\") == Property(i, \"OwnerFullName\"))))"), - RemoveNewLines(message)); + RemoveNewLines(CoreStrings.QueryFailed("Concat(\n source1: AsQueryable(MaterializeCollectionNavigation(Navigation: Gear.Weapons (k__BackingField, ICollection) Collection ToDependent Weapon Inverse: Owner, Where(\n source: NavigationExpansionExpression\n Source: Where(\n source: DbSet, \n predicate: (w) => Property((Unhandled parameter: g), \"FullName\") == Property(w, \"OwnerFullName\"))\n PendingSelector: (w) => NavigationTreeExpression\n Value: EntityReferenceWeapon\n Expression: w\n , \n predicate: (i) => Property(NavigationTreeExpression\n Value: EntityReferenceGear\n Expression: (Unhandled parameter: g), \"FullName\") == Property(i, \"OwnerFullName\")))), \n source2: MaterializeCollectionNavigation(Navigation: Gear.Weapons (k__BackingField, ICollection) Collection ToDependent Weapon Inverse: Owner, Where(\n source: NavigationExpansionExpression\n Source: Where(\n source: DbSet, \n predicate: (w0) => Property((Unhandled parameter: g), \"FullName\") == Property(w0, \"OwnerFullName\"))\n PendingSelector: (w0) => NavigationTreeExpression\n Value: EntityReferenceWeapon\n Expression: w0\n , \n predicate: (i) => Property(NavigationTreeExpression\n Value: EntityReferenceGear\n Expression: (Unhandled parameter: g), \"FullName\") == Property(i, \"OwnerFullName\"))))", "NavigationExpandingExpressionVisitor")), + RemoveNewLines(message)); } [ConditionalTheory(Skip = "Issue #17068")] @@ -1769,7 +1769,7 @@ public virtual async Task Concat_with_collection_navigations(bool isAsync) gs => gs.Where(g => g.HasSoulPatch).Select(g => g.Weapons.Union(g.Weapons).Count())))).Message; Assert.Equal( - CoreStrings.TranslationFailed("Union( source1: AsQueryable(MaterializeCollectionNavigation(Navigation: Gear.Weapons (k__BackingField, ICollection) Collection ToDependent Weapon Inverse: Owner, Where( source: NavigationExpansionExpression Source: Where( source: DbSet, predicate: (w) => Property((Unhandled parameter: g), \"FullName\") == Property(w, \"OwnerFullName\")) PendingSelector: (w) => NavigationTreeExpression Value: EntityReferenceWeapon Expression: w , predicate: (i) => Property(NavigationTreeExpression Value: EntityReferenceGear Expression: (Unhandled parameter: g), \"FullName\") == Property(i, \"OwnerFullName\")))), source2: MaterializeCollectionNavigation(Navigation: Gear.Weapons (k__BackingField, ICollection) Collection ToDependent Weapon Inverse: Owner, Where( source: NavigationExpansionExpression Source: Where( source: DbSet, predicate: (w0) => Property((Unhandled parameter: g), \"FullName\") == Property(w0, \"OwnerFullName\")) PendingSelector: (w0) => NavigationTreeExpression Value: EntityReferenceWeapon Expression: w0 , predicate: (i) => Property(NavigationTreeExpression Value: EntityReferenceGear Expression: (Unhandled parameter: g), \"FullName\") == Property(i, \"OwnerFullName\"))))"), + RemoveNewLines(CoreStrings.QueryFailed("Union(\n source1: AsQueryable(MaterializeCollectionNavigation(Navigation: Gear.Weapons (k__BackingField, ICollection) Collection ToDependent Weapon Inverse: Owner, Where(\n source: NavigationExpansionExpression\n Source: Where(\n source: DbSet, \n predicate: (w) => Property((Unhandled parameter: g), \"FullName\") == Property(w, \"OwnerFullName\"))\n PendingSelector: (w) => NavigationTreeExpression\n Value: EntityReferenceWeapon\n Expression: w\n , \n predicate: (i) => Property(NavigationTreeExpression\n Value: EntityReferenceGear\n Expression: (Unhandled parameter: g), \"FullName\") == Property(i, \"OwnerFullName\")))), \n source2: MaterializeCollectionNavigation(Navigation: Gear.Weapons (k__BackingField, ICollection) Collection ToDependent Weapon Inverse: Owner, Where(\n source: NavigationExpansionExpression\n Source: Where(\n source: DbSet, \n predicate: (w0) => Property((Unhandled parameter: g), \"FullName\") == Property(w0, \"OwnerFullName\"))\n PendingSelector: (w0) => NavigationTreeExpression\n Value: EntityReferenceWeapon\n Expression: w0\n , \n predicate: (i) => Property(NavigationTreeExpression\n Value: EntityReferenceGear\n Expression: (Unhandled parameter: g), \"FullName\") == Property(i, \"OwnerFullName\"))))", "NavigationExpandingExpressionVisitor")), RemoveNewLines(message)); } @@ -3474,7 +3474,7 @@ from v in Veterans(g.Reports) elementSorter: e => e.g + e.v))).Message; Assert.Equal( - CoreStrings.TranslationFailed("(g) => Veterans(g.Reports)"), + CoreStrings.QueryFailed("(g) => Veterans(g.Reports)", "NavigationExpandingExpressionVisitor"), RemoveNewLines(message)); } diff --git a/test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.ResultOperators.cs b/test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.ResultOperators.cs index 8307b0a77d5..f007375308d 100644 --- a/test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.ResultOperators.cs +++ b/test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.ResultOperators.cs @@ -1704,8 +1704,8 @@ public virtual void Paging_operation_on_string_doesnt_issue_warning() using (var context = CreateContext()) { Assert.Equal( - CoreStrings.TranslationFailed( - "AsQueryable(NavigationTreeExpression Value: EntityReferenceCustomer Expression: (Unhandled parameter: c).CustomerID)"), + CoreStrings.QueryFailed( + "AsQueryable(NavigationTreeExpression Value: EntityReferenceCustomer Expression: (Unhandled parameter: c).CustomerID)", "NavigationExpandingExpressionVisitor"), RemoveNewLines( Assert.Throws( () => context.Customers.Select(c => c.CustomerID.FirstOrDefault()).ToList()).Message)); diff --git a/test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs b/test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs index 9ddffb67d6e..3b0dff722d8 100644 --- a/test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs +++ b/test/EFCore.Specification.Tests/Query/SimpleQueryTestBase.cs @@ -2283,7 +2283,7 @@ public virtual Task OrderBy_scalar_primitive(bool isAsync) public virtual async Task SelectMany_mixed(bool isAsync) { Assert.Equal( - CoreStrings.TranslationFailed("(e1) => string[] { \"a\", \"b\", }"), + CoreStrings.QueryFailed("(e1) => string[] { \"a\", \"b\", }", "NavigationExpandingExpressionVisitor"), RemoveNewLines( (await Assert.ThrowsAsync( () => AssertQuery( @@ -2767,7 +2767,7 @@ from e in es.Where(c => c.EmployeeID == NonExistentID).DefaultIfEmpty() public virtual async Task Default_if_empty_top_level_arg(bool isAsync) { Assert.Equal( - CoreStrings.TranslationFailed("DefaultIfEmpty( source: Where( source: DbSet, predicate: (c) => c.EmployeeID == 4294967295), defaultValue: (Unhandled parameter: __p_0))"), + CoreStrings.QueryFailed("DefaultIfEmpty( source: Where( source: DbSet, predicate: (c) => c.EmployeeID == 4294967295), defaultValue: (Unhandled parameter: __p_0))", "NavigationExpandingExpressionVisitor"), RemoveNewLines( (await Assert.ThrowsAsync( () => AssertQuery( @@ -2783,7 +2783,7 @@ from e in es.Where(c => c.EmployeeID == NonExistentID).DefaultIfEmpty(new Employ public virtual async Task Default_if_empty_top_level_arg_followed_by_projecting_constant(bool isAsync) { Assert.Equal( - CoreStrings.TranslationFailed("DefaultIfEmpty( source: Where( source: DbSet, predicate: (c) => c.EmployeeID == 4294967295), defaultValue: (Unhandled parameter: __p_0))"), + CoreStrings.QueryFailed("DefaultIfEmpty( source: Where( source: DbSet, predicate: (c) => c.EmployeeID == 4294967295), defaultValue: (Unhandled parameter: __p_0))", "NavigationExpandingExpressionVisitor"), RemoveNewLines( (await Assert.ThrowsAsync( () => AssertQueryScalar( diff --git a/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs b/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs index 00e02d192ad..38b4bae6835 100644 --- a/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs +++ b/test/EFCore.Sqlite.FunctionalTests/Query/GearsOfWarQuerySqliteTest.cs @@ -3,6 +3,7 @@ using System; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore.Diagnostics; using Xunit; namespace Microsoft.EntityFrameworkCore.Query @@ -17,8 +18,8 @@ public GearsOfWarQuerySqliteTest(GearsOfWarQuerySqliteFixture fixture) // SQLite client-eval public override async Task Where_datetimeoffset_date_component(bool isAsync) { - Assert.StartsWith( - "The LINQ expression", + Assert.Equal( + CoreStrings.TranslationFailed("(m) => m.Timeline.Date > (Unhandled parameter: __Date_0)"), (await Assert.ThrowsAsync( () => base.Where_datetimeoffset_date_component(isAsync))) .Message); @@ -27,8 +28,8 @@ public override async Task Where_datetimeoffset_date_component(bool isAsync) // SQLite client-eval public override async Task Where_datetimeoffset_day_component(bool isAsync) { - Assert.StartsWith( - "The LINQ expression", + Assert.Equal( + CoreStrings.TranslationFailed("(m) => m.Timeline.Day == 2"), (await Assert.ThrowsAsync( () => base.Where_datetimeoffset_day_component(isAsync))) .Message); @@ -37,8 +38,8 @@ public override async Task Where_datetimeoffset_day_component(bool isAsync) // SQLite client-eval public override async Task Where_datetimeoffset_dayofyear_component(bool isAsync) { - Assert.StartsWith( - "The LINQ expression", + Assert.Equal( + CoreStrings.TranslationFailed("(m) => m.Timeline.DayOfYear == 2"), (await Assert.ThrowsAsync( () => base.Where_datetimeoffset_dayofyear_component(isAsync))) .Message); @@ -47,8 +48,8 @@ public override async Task Where_datetimeoffset_dayofyear_component(bool isAsync // SQLite client-eval public override async Task Where_datetimeoffset_hour_component(bool isAsync) { - Assert.StartsWith( - "The LINQ expression", + Assert.Equal( + CoreStrings.TranslationFailed("(m) => m.Timeline.Hour == 10"), (await Assert.ThrowsAsync( () => base.Where_datetimeoffset_hour_component(isAsync))) .Message); @@ -57,8 +58,8 @@ public override async Task Where_datetimeoffset_hour_component(bool isAsync) // SQLite client-eval public override async Task Where_datetimeoffset_millisecond_component(bool isAsync) { - Assert.StartsWith( - "The LINQ expression", + Assert.Equal( + CoreStrings.TranslationFailed("(m) => m.Timeline.Millisecond == 0"), (await Assert.ThrowsAsync( () => base.Where_datetimeoffset_millisecond_component(isAsync))) .Message); @@ -67,8 +68,8 @@ public override async Task Where_datetimeoffset_millisecond_component(bool isAsy // SQLite client-eval public override async Task Where_datetimeoffset_minute_component(bool isAsync) { - Assert.StartsWith( - "The LINQ expression", + Assert.Equal( + CoreStrings.TranslationFailed("(m) => m.Timeline.Minute == 0"), (await Assert.ThrowsAsync( () => base.Where_datetimeoffset_minute_component(isAsync))) .Message); @@ -77,8 +78,8 @@ public override async Task Where_datetimeoffset_minute_component(bool isAsync) // SQLite client-eval public override async Task Where_datetimeoffset_month_component(bool isAsync) { - Assert.StartsWith( - "The LINQ expression", + Assert.Equal( + CoreStrings.TranslationFailed("(m) => m.Timeline.Month == 1"), (await Assert.ThrowsAsync( () => base.Where_datetimeoffset_month_component(isAsync))) .Message); @@ -87,8 +88,8 @@ public override async Task Where_datetimeoffset_month_component(bool isAsync) // SQLite client-eval public override async Task Where_datetimeoffset_now(bool isAsync) { - Assert.StartsWith( - "The LINQ expression", + Assert.Equal( + CoreStrings.TranslationFailed("(m) => m.Timeline != DateTimeOffset.Now"), (await Assert.ThrowsAsync( () => base.Where_datetimeoffset_now(isAsync))) .Message); @@ -97,8 +98,8 @@ public override async Task Where_datetimeoffset_now(bool isAsync) // SQLite client-eval public override async Task Where_datetimeoffset_second_component(bool isAsync) { - Assert.StartsWith( - "The LINQ expression", + Assert.Equal( + CoreStrings.TranslationFailed("(m) => m.Timeline.Second == 0"), (await Assert.ThrowsAsync( () => base.Where_datetimeoffset_second_component(isAsync))) .Message); @@ -107,8 +108,8 @@ public override async Task Where_datetimeoffset_second_component(bool isAsync) // SQLite client-eval public override async Task Where_datetimeoffset_utcnow(bool isAsync) { - Assert.StartsWith( - "The LINQ expression", + Assert.Equal( + CoreStrings.TranslationFailed("(m) => m.Timeline != DateTimeOffset.UtcNow"), (await Assert.ThrowsAsync( () => base.Where_datetimeoffset_utcnow(isAsync))) .Message); @@ -117,8 +118,8 @@ public override async Task Where_datetimeoffset_utcnow(bool isAsync) // SQLite client-eval public override async Task Where_datetimeoffset_year_component(bool isAsync) { - Assert.StartsWith( - "The LINQ expression", + Assert.Equal( + CoreStrings.TranslationFailed("(m) => m.Timeline.Year == 2"), (await Assert.ThrowsAsync( () => base.Where_datetimeoffset_year_component(isAsync))) .Message); @@ -127,13 +128,18 @@ public override async Task Where_datetimeoffset_year_component(bool isAsync) // SQLite client-eval public override async Task DateTimeOffset_Contains_Less_than_Greater_than(bool isAsync) { - Assert.StartsWith( - "The LINQ expression", - (await Assert.ThrowsAsync( - () => base.DateTimeOffset_Contains_Less_than_Greater_than(isAsync))) - .Message); + Assert.Equal( + CoreStrings.TranslationFailed( + "(m) => (Unhandled parameter: __start_0) <= (DateTimeOffset)m.Timeline.Date && m.Timeline < (Unhandled parameter: __end_1) && Contains( source: (Unhandled parameter: __dates_2), value: m.Timeline)"), + RemoveNewLines( + (await Assert.ThrowsAsync( + () => base.DateTimeOffset_Contains_Less_than_Greater_than(isAsync))) + .Message)); } + private string RemoveNewLines(string message) + => message.Replace("\n", "").Replace("\r", ""); + // Sqlite does not support lateral joins public override Task Correlated_collections_inner_subquery_predicate_references_outer_qsre(bool isAsync) => null;