diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 8487a62..36157ee 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -29,7 +29,9 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
- dotnet-version: 8.0.x
+ dotnet-version: |
+ 8.0.x
+ 9.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
@@ -46,7 +48,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
- dotnet-version: 8.0.x
+ dotnet-version: 9.0.x
- name: Pack
run: |
dotnet pack -v normal -c Debug --include-symbols --include-source -p:PackageVersion=4.0.0-pre-$GITHUB_RUN_ID -o nupkg
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 6f1fb37..1541c27 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -26,7 +26,7 @@ jobs:
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
- dotnet-version: 8.0.x
+ dotnet-version: 9.0.x
include-prerelease: True
- name: Create Release NuGet package
run: |
diff --git a/Directory.Build.props b/Directory.Build.props
index b5a6e4e..3f8c28f 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -6,6 +6,7 @@
enable
true
CS1591
+ false
enable
diff --git a/Directory.Packages.props b/Directory.Packages.props
index d25f1f4..fd8a688 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -2,21 +2,28 @@
true
-
-
-
-
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
\ No newline at end of file
diff --git a/global.json b/global.json
index bfca90d..20f482a 100644
--- a/global.json
+++ b/global.json
@@ -1,5 +1,5 @@
{
"sdk": {
- "version": "8.0.400"
+ "version": "9.0.100"
}
}
\ No newline at end of file
diff --git a/src/EntityFrameworkCore.Projectables/Services/ProjectableExpressionReplacer.cs b/src/EntityFrameworkCore.Projectables/Services/ProjectableExpressionReplacer.cs
index c9d8ad4..c334b4e 100644
--- a/src/EntityFrameworkCore.Projectables/Services/ProjectableExpressionReplacer.cs
+++ b/src/EntityFrameworkCore.Projectables/Services/ProjectableExpressionReplacer.cs
@@ -1,9 +1,8 @@
using System.Collections;
-using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
-using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
+using System.Runtime.CompilerServices;
using EntityFrameworkCore.Projectables.Extensions;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Query;
@@ -12,9 +11,10 @@ namespace EntityFrameworkCore.Projectables.Services
{
public sealed class ProjectableExpressionReplacer : ExpressionVisitor
{
- readonly IProjectionExpressionResolver _resolver;
- readonly ExpressionArgumentReplacer _expressionArgumentReplacer = new();
- readonly Dictionary _projectableMemberCache = new();
+ private readonly IProjectionExpressionResolver _resolver;
+ private readonly ExpressionArgumentReplacer _expressionArgumentReplacer = new();
+ private readonly Dictionary _projectableMemberCache = new();
+ private IQueryProvider? _currentQueryProvider;
private bool _disableRootRewrite;
private IEntityType? _entityType;
@@ -60,6 +60,9 @@ bool TryGetReflectedExpression(MemberInfo memberInfo, [NotNullWhen(true)] out La
public Expression? Replace(Expression? node)
{
_disableRootRewrite = false;
+ _currentQueryProvider = null;
+ _entityType = null;
+
var ret = Visit(node);
if (_disableRootRewrite)
@@ -190,6 +193,29 @@ protected override Expression VisitMethodCall(MethodCallExpression node)
protected override Expression VisitMember(MemberExpression node)
{
+ // Evaluate captured variables in closures that contain EF queries to inline them into the main query
+ if (node.Expression is ConstantExpression constant &&
+ constant.Type.Attributes.HasFlag(TypeAttributes.NestedPrivate) &&
+ Attribute.IsDefined(constant.Type, typeof(CompilerGeneratedAttribute), inherit: true))
+ {
+ try
+ {
+ var value = Expression
+ .Lambda>(Expression.Convert(node, typeof(object)))
+ .Compile()
+ .Invoke();
+
+ if (value is IQueryable queryable && ReferenceEquals(queryable.Provider, _currentQueryProvider))
+ {
+ return Visit(queryable.Expression);
+ }
+ }
+ catch
+ {
+ // Ignore evaluation exceptions - continue with normal processing
+ }
+ }
+
var nodeExpression = node.Expression switch {
UnaryExpression { NodeType: ExpressionType.Convert, Type: { IsInterface: true } type, Operand: { } operand }
when type.IsAssignableFrom(operand.Type)
@@ -232,6 +258,7 @@ protected override Expression VisitExtension(Expression node)
if (node is EntityQueryRootExpression root)
{
_entityType = root.EntityType;
+ _currentQueryProvider = root.QueryProvider;
}
return base.VisitExtension(node);
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexArgumentsTests.ArrayOfPrimitivesArguments.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexArgumentsTests.ArrayOfPrimitivesArguments.DotNet9_0.verified.txt
new file mode 100644
index 0000000..f12934f
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexArgumentsTests.ArrayOfPrimitivesArguments.DotNet9_0.verified.txt
@@ -0,0 +1,8 @@
+DECLARE @__validArray_0 nvarchar(4000) = N'[1,2,3]';
+
+SELECT [t].[Id]
+FROM [TestEntity] AS [t]
+WHERE [t].[Id] IN (
+ SELECT [v].[value]
+ FROM OPENJSON(@__validArray_0) WITH ([value] int '$') AS [v]
+)
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexArgumentsTests.ListOfPrimitivesArguments.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexArgumentsTests.ListOfPrimitivesArguments.DotNet9_0.verified.txt
new file mode 100644
index 0000000..f534e45
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexArgumentsTests.ListOfPrimitivesArguments.DotNet9_0.verified.txt
@@ -0,0 +1,8 @@
+DECLARE @__validList_0 nvarchar(4000) = N'[1,2,3]';
+
+SELECT [t].[Id]
+FROM [TestEntity] AS [t]
+WHERE [t].[Id] IN (
+ SELECT [v].[value]
+ FROM OPENJSON(@__validList_0) WITH ([value] int '$') AS [v]
+)
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexArgumentsTests.ParamsOfPrimitivesArguments.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexArgumentsTests.ParamsOfPrimitivesArguments.DotNet9_0.verified.txt
new file mode 100644
index 0000000..53c8a5b
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexArgumentsTests.ParamsOfPrimitivesArguments.DotNet9_0.verified.txt
@@ -0,0 +1,3 @@
+SELECT [t].[Id]
+FROM [TestEntity] AS [t]
+WHERE [t].[Id] IN (1, 2, 3)
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexModelTests.ProjectOverCollectionNavigationProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexModelTests.ProjectOverCollectionNavigationProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..a79c3ab
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexModelTests.ProjectOverCollectionNavigationProperty.DotNet9_0.verified.txt
@@ -0,0 +1,10 @@
+SELECT [o1].[RecordDate]
+FROM [User] AS [u]
+INNER JOIN (
+ SELECT [o0].[RecordDate], [o0].[UserId]
+ FROM (
+ SELECT [o].[RecordDate], [o].[UserId], ROW_NUMBER() OVER(PARTITION BY [o].[UserId] ORDER BY [o].[RecordDate] DESC) AS [row]
+ FROM [Order] AS [o]
+ ) AS [o0]
+ WHERE [o0].[row] <= 2
+) AS [o1] ON [u].[Id] = [o1].[UserId]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexModelTests.ProjectOverMethodTakingDbContext.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexModelTests.ProjectOverMethodTakingDbContext.DotNet9_0.verified.txt
new file mode 100644
index 0000000..1417cfa
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexModelTests.ProjectOverMethodTakingDbContext.DotNet9_0.verified.txt
@@ -0,0 +1,10 @@
+SELECT [o1].[Id], [o1].[RecordDate], [o1].[UserId]
+FROM [User] AS [u]
+LEFT JOIN (
+ SELECT [o0].[Id], [o0].[RecordDate], [o0].[UserId]
+ FROM (
+ SELECT [o].[Id], [o].[RecordDate], [o].[UserId], ROW_NUMBER() OVER(PARTITION BY [o].[UserId] ORDER BY [o].[RecordDate] DESC) AS [row]
+ FROM [Order] AS [o]
+ ) AS [o0]
+ WHERE [o0].[row] <= 1
+) AS [o1] ON [u].[Id] = [o1].[UserId]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexModelTests.ProjectOverNavigationProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexModelTests.ProjectOverNavigationProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..0178f4c
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ComplexModelTests.ProjectOverNavigationProperty.DotNet9_0.verified.txt
@@ -0,0 +1,6 @@
+SELECT (
+ SELECT TOP(1) [o].[RecordDate]
+ FROM [Order] AS [o]
+ WHERE [u].[Id] = [o].[UserId]
+ ORDER BY [o].[RecordDate] DESC)
+FROM [User] AS [u]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/DefaultValueTests.ExplicitDefaultValueIsSupported.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/DefaultValueTests.ExplicitDefaultValueIsSupported.DotNet9_0.verified.txt
new file mode 100644
index 0000000..1bc0597
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/DefaultValueTests.ExplicitDefaultValueIsSupported.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id] + 2
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/EntityFrameworkCore.Projectables.FunctionalTests.csproj b/tests/EntityFrameworkCore.Projectables.FunctionalTests/EntityFrameworkCore.Projectables.FunctionalTests.csproj
index bb5b0c5..96c4d7a 100644
--- a/tests/EntityFrameworkCore.Projectables.FunctionalTests/EntityFrameworkCore.Projectables.FunctionalTests.csproj
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/EntityFrameworkCore.Projectables.FunctionalTests.csproj
@@ -1,6 +1,7 @@
+ net8.0;net9.0
false
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionsMethods/ExtensionMethodTests.ExtensionMethodAcceptingDbContext.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionsMethods/ExtensionMethodTests.ExtensionMethodAcceptingDbContext.DotNet9_0.verified.txt
new file mode 100644
index 0000000..f92c2fa
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionsMethods/ExtensionMethodTests.ExtensionMethodAcceptingDbContext.DotNet9_0.verified.txt
@@ -0,0 +1,7 @@
+SELECT [e1].[Id]
+FROM [Entity] AS [e]
+OUTER APPLY (
+ SELECT TOP(1) [e0].[Id]
+ FROM [Entity] AS [e0]
+ WHERE [e0].[Id] > [e].[Id]
+) AS [e1]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionsMethods/ExtensionMethodTests.ExtensionOnPrimitive.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionsMethods/ExtensionMethodTests.ExtensionOnPrimitive.DotNet9_0.verified.txt
new file mode 100644
index 0000000..d0c82fc
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionsMethods/ExtensionMethodTests.ExtensionOnPrimitive.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id] * [e].[Id]
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionsMethods/ExtensionMethodTests.SelectProjectableExtensionMethod.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionsMethods/ExtensionMethodTests.SelectProjectableExtensionMethod.DotNet9_0.verified.txt
new file mode 100644
index 0000000..5cc0e40
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionsMethods/ExtensionMethodTests.SelectProjectableExtensionMethod.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id] + 1
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionsMethods/ExtensionMethodTests.SelectProjectableExtensionMethod2.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionsMethods/ExtensionMethodTests.SelectProjectableExtensionMethod2.DotNet9_0.verified.txt
new file mode 100644
index 0000000..43ca93d
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ExtensionsMethods/ExtensionMethodTests.SelectProjectableExtensionMethod2.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id] + 1 + 1
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/Generics/GenericEntityTests.HasMatchingStringKeyConversion_GetsTranslated.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/Generics/GenericEntityTests.HasMatchingStringKeyConversion_GetsTranslated.DotNet9_0.verified.txt
new file mode 100644
index 0000000..85bfd00
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/Generics/GenericEntityTests.HasMatchingStringKeyConversion_GetsTranslated.DotNet9_0.verified.txt
@@ -0,0 +1,5 @@
+DECLARE @__key_0 varchar(11) = 'x';
+
+SELECT [c].[Id]
+FROM [ConcreteEntity] AS [c]
+WHERE CONVERT(varchar(11), [c].[Id]) = @__key_0
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/Generics/GenericFunctionTests.DefaultIfIdIsNegative.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/Generics/GenericFunctionTests.DefaultIfIdIsNegative.DotNet9_0.verified.txt
new file mode 100644
index 0000000..f42386a
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/Generics/GenericFunctionTests.DefaultIfIdIsNegative.DotNet9_0.verified.txt
@@ -0,0 +1,5 @@
+SELECT CASE
+ WHEN [e].[Id] >= 0 THEN CAST(1 AS bit)
+ ELSE CAST(0 AS bit)
+END, [e].[Id], [e].[Name]
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/Generics/MultipleGenericsTests.TestMultipleArguments.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/Generics/MultipleGenericsTests.TestMultipleArguments.DotNet9_0.verified.txt
new file mode 100644
index 0000000..a441b21
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/Generics/MultipleGenericsTests.TestMultipleArguments.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT CAST(1 AS bit), [e].[Id], [e].[Name]
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedMembersTests.ProjectOverMethodTakingDbContext.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedMembersTests.ProjectOverMethodTakingDbContext.DotNet9_0.verified.txt
new file mode 100644
index 0000000..201760c
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedMembersTests.ProjectOverMethodTakingDbContext.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT CAST([c].[Age] AS float) / [c].[AverageLifespan] AS [LifeProgression], CAST([c].[MentalAge] AS float) / [c].[AverageLifespan] AS [MentalLifeProgression]
+FROM [Cat] AS [c]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverExtensionMethod.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverExtensionMethod.DotNet9_0.verified.txt
new file mode 100644
index 0000000..79a9f39
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverExtensionMethod.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT 4
+FROM [Concrete] AS [c]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverImplementedMethod.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverImplementedMethod.DotNet9_0.verified.txt
new file mode 100644
index 0000000..6be5124
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverImplementedMethod.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT 2
+FROM [Concrete] AS [c]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverImplementedProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverImplementedProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..6be5124
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverImplementedProperty.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT 2
+FROM [Concrete] AS [c]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverInheritedMethodImplementation.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverInheritedMethodImplementation.DotNet9_0.verified.txt
new file mode 100644
index 0000000..960d720
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverInheritedMethodImplementation.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT 2
+FROM [MoreConcrete] AS [m]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverInheritedPropertyImplementation.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverInheritedPropertyImplementation.DotNet9_0.verified.txt
new file mode 100644
index 0000000..960d720
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverInheritedPropertyImplementation.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT 2
+FROM [MoreConcrete] AS [m]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverOverriddenMethodImplementation.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverOverriddenMethodImplementation.DotNet9_0.verified.txt
new file mode 100644
index 0000000..6be5124
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverOverriddenMethodImplementation.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT 2
+FROM [Concrete] AS [c]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverOverriddenPropertyImplementation.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverOverriddenPropertyImplementation.DotNet9_0.verified.txt
new file mode 100644
index 0000000..6be5124
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverOverriddenPropertyImplementation.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT 2
+FROM [Concrete] AS [c]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverProvider.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverProvider.DotNet9_0.verified.txt
new file mode 100644
index 0000000..558afe4
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/InheritedModelTests.ProjectOverProvider.DotNet9_0.verified.txt
@@ -0,0 +1,3 @@
+SELECT [c].[Id]
+FROM [BaseProvider] AS [b]
+INNER JOIN [Concrete] AS [c] ON [b].[Id] = [c].[BaseProviderId]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/MethodGroupTests.ProjectOverMethodGroup.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/MethodGroupTests.ProjectOverMethodGroup.DotNet9_0.verified.txt
new file mode 100644
index 0000000..c1dc490
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/MethodGroupTests.ProjectOverMethodGroup.DotNet9_0.verified.txt
@@ -0,0 +1,4 @@
+SELECT [e].[Id], [e0].[Id] + 1, [e0].[Id]
+FROM [Entity] AS [e]
+LEFT JOIN [Entity] AS [e0] ON [e].[Id] = [e0].[EntityId]
+ORDER BY [e].[Id]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/ModuleInitializer.cs b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ModuleInitializer.cs
new file mode 100644
index 0000000..16eaa1e
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/ModuleInitializer.cs
@@ -0,0 +1,15 @@
+using System.Runtime.CompilerServices;
+
+namespace EntityFrameworkCore.Projectables.FunctionalTests
+{
+ public static class ModuleInitializer
+ {
+ [ModuleInitializer]
+ public static void Initialize()
+ {
+#if !NET8_0
+ VerifierSettings.UniqueForTargetFrameworkAndVersion();
+#endif
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/NameSyntaxTests.QualifiedNameSyntaxTest.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NameSyntaxTests.QualifiedNameSyntaxTest.DotNet9_0.verified.txt
new file mode 100644
index 0000000..874f496
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NameSyntaxTests.QualifiedNameSyntaxTest.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT 7
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/IngoreNullConditionalRewriteTests.ComplexMemberExpression.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/IngoreNullConditionalRewriteTests.ComplexMemberExpression.DotNet9_0.verified.txt
new file mode 100644
index 0000000..ba1f2c1
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/IngoreNullConditionalRewriteTests.ComplexMemberExpression.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT CAST(LEN([e].[Name]) AS int)
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/IngoreNullConditionalRewriteTests.RelationalExpression.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/IngoreNullConditionalRewriteTests.RelationalExpression.DotNet9_0.verified.txt
new file mode 100644
index 0000000..ebb4e47
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/IngoreNullConditionalRewriteTests.RelationalExpression.DotNet9_0.verified.txt
@@ -0,0 +1,10 @@
+SELECT [e2].[Id], [e2].[EntityId], [e2].[Name]
+FROM [Entity] AS [e]
+LEFT JOIN (
+ SELECT [e1].[Id], [e1].[EntityId], [e1].[Name]
+ FROM (
+ SELECT [e0].[Id], [e0].[EntityId], [e0].[Name], ROW_NUMBER() OVER(PARTITION BY [e0].[EntityId] ORDER BY [e0].[Id]) AS [row]
+ FROM [Entity] AS [e0]
+ ) AS [e1]
+ WHERE 0 < [e1].[row] AND [e1].[row] <= 1
+) AS [e2] ON [e].[Id] = [e2].[EntityId]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/IngoreNullConditionalRewriteTests.SimpleMemberExpression.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/IngoreNullConditionalRewriteTests.SimpleMemberExpression.DotNet9_0.verified.txt
new file mode 100644
index 0000000..36503d4
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/IngoreNullConditionalRewriteTests.SimpleMemberExpression.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Name]
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/RewriteNullConditionalRewriteTests.ComplexMemberExpression.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/RewriteNullConditionalRewriteTests.ComplexMemberExpression.DotNet9_0.verified.txt
new file mode 100644
index 0000000..ba1f2c1
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/RewriteNullConditionalRewriteTests.ComplexMemberExpression.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT CAST(LEN([e].[Name]) AS int)
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/RewriteNullConditionalRewriteTests.RelationalExpression.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/RewriteNullConditionalRewriteTests.RelationalExpression.DotNet9_0.verified.txt
new file mode 100644
index 0000000..a67eecc
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/RewriteNullConditionalRewriteTests.RelationalExpression.DotNet9_0.verified.txt
@@ -0,0 +1,12 @@
+SELECT CAST(1 AS bit), [e].[Id], [e0].[Id], [e0].[EntityId], [e0].[Name], [e3].[Id], [e3].[EntityId], [e3].[Name]
+FROM [Entity] AS [e]
+LEFT JOIN [Entity] AS [e0] ON [e].[Id] = [e0].[EntityId]
+LEFT JOIN (
+ SELECT [e2].[Id], [e2].[EntityId], [e2].[Name]
+ FROM (
+ SELECT [e1].[Id], [e1].[EntityId], [e1].[Name], ROW_NUMBER() OVER(PARTITION BY [e1].[EntityId] ORDER BY [e1].[Id]) AS [row]
+ FROM [Entity] AS [e1]
+ ) AS [e2]
+ WHERE 0 < [e2].[row] AND [e2].[row] <= 1
+) AS [e3] ON [e].[Id] = [e3].[EntityId]
+ORDER BY [e].[Id]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/RewriteNullConditionalRewriteTests.SimpleMemberExpression.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/RewriteNullConditionalRewriteTests.SimpleMemberExpression.DotNet9_0.verified.txt
new file mode 100644
index 0000000..36503d4
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NullConditionals/RewriteNullConditionalRewriteTests.SimpleMemberExpression.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Name]
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/PrivateProjectables.Issue63Repro.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/PrivateProjectables.Issue63Repro.DotNet9_0.verified.txt
new file mode 100644
index 0000000..b1c3b32
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/PrivateProjectables.Issue63Repro.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id]
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.EntityRootSubqueryExpression.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.EntityRootSubqueryExpression.DotNet9_0.verified.txt
new file mode 100644
index 0000000..75b71ad
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.EntityRootSubqueryExpression.DotNet9_0.verified.txt
@@ -0,0 +1,6 @@
+SELECT [e].[Id], (
+ SELECT COUNT(*)
+ FROM [Entity] AS [e0]
+ WHERE [e0].[Id] * 5 = 5) AS [TotalCount]
+FROM [Entity] AS [e]
+WHERE [e].[Id] * 5 = 5
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.EntityRootSubqueryExpression.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.EntityRootSubqueryExpression.verified.txt
new file mode 100644
index 0000000..75b71ad
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.EntityRootSubqueryExpression.verified.txt
@@ -0,0 +1,6 @@
+SELECT [e].[Id], (
+ SELECT COUNT(*)
+ FROM [Entity] AS [e0]
+ WHERE [e0].[Id] * 5 = 5) AS [TotalCount]
+FROM [Entity] AS [e]
+WHERE [e].[Id] * 5 = 5
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.UseMemberPropertyQueryRootExpression.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.UseMemberPropertyQueryRootExpression.DotNet9_0.verified.txt
new file mode 100644
index 0000000..3b8b9ae
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.UseMemberPropertyQueryRootExpression.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id], [e].[Id] * 5
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.cs b/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.cs
index bef2283..3baadfd 100644
--- a/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.cs
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/QueryRootTests.cs
@@ -1,9 +1,6 @@
using System.ComponentModel.DataAnnotations.Schema;
-using System.Threading.Tasks;
using EntityFrameworkCore.Projectables.FunctionalTests.Helpers;
using Microsoft.EntityFrameworkCore;
-using VerifyXunit;
-using Xunit;
namespace EntityFrameworkCore.Projectables.FunctionalTests
{
@@ -35,5 +32,20 @@ public Task UseMemberPropertyQueryRootExpression()
return Verifier.Verify(query.ToQueryString());
}
+
+
+ [Fact]
+ public Task EntityRootSubqueryExpression()
+ {
+ using var dbContext = new SampleDbContext();
+
+ var original = dbContext.Set()
+ .Where(e => e.ComputedWithBacking == 5);
+
+ var query = original
+ .Select(e => new { Item = e, TotalCount = original.Count() });
+
+ return Verifier.Verify(query.ToQueryString());
+ }
}
}
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullComplexFunctionTests.FilterOnProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullComplexFunctionTests.FilterOnProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..d4ddd00
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullComplexFunctionTests.FilterOnProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,3 @@
+SELECT [e].[Id]
+FROM [Entity] AS [e]
+WHERE [e].[Id] + 1 = 2
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullComplexFunctionTests.PassInReferenceArguments.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullComplexFunctionTests.PassInReferenceArguments.DotNet9_0.verified.txt
new file mode 100644
index 0000000..f85a6fa
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullComplexFunctionTests.PassInReferenceArguments.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id] + [e].[Id]
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullComplexFunctionTests.PassInVariableArguments.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullComplexFunctionTests.PassInVariableArguments.DotNet9_0.verified.txt
new file mode 100644
index 0000000..2a7d907
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullComplexFunctionTests.PassInVariableArguments.DotNet9_0.verified.txt
@@ -0,0 +1,4 @@
+DECLARE @__argument_0 int = 1;
+
+SELECT [e].[Id] + @__argument_0
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullComplexFunctionTests.SelectProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullComplexFunctionTests.SelectProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..5cc0e40
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullComplexFunctionTests.SelectProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id] + 1
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.CombineSelectProjectableProperties.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.CombineSelectProjectableProperties.DotNet9_0.verified.txt
new file mode 100644
index 0000000..c89d0e6
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.CombineSelectProjectableProperties.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id] + [e].[Id] * 2
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.FilterOnComplexProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.FilterOnComplexProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..6c95f6a
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.FilterOnComplexProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,3 @@
+SELECT [e].[Id]
+FROM [Entity] AS [e]
+WHERE [e].[Id] * 2 = 2
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.FilterOnProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.FilterOnProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..291fcb8
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.FilterOnProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,3 @@
+SELECT [e].[Id]
+FROM [Entity] AS [e]
+WHERE [e].[Id] = 1
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.SelectComplexProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.SelectComplexProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..a3cb54d
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.SelectComplexProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id] * 2
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.SelectProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.SelectProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..b1c3b32
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullPropertyTests.SelectProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id]
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.CombineSelectProjectableProperties.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.CombineSelectProjectableProperties.DotNet9_0.verified.txt
new file mode 100644
index 0000000..c89d0e6
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.CombineSelectProjectableProperties.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id] + [e].[Id] * 2
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.FilterOnComplexProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.FilterOnComplexProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..6c95f6a
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.FilterOnComplexProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,3 @@
+SELECT [e].[Id]
+FROM [Entity] AS [e]
+WHERE [e].[Id] * 2 = 2
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.FilterOnProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.FilterOnProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..291fcb8
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.FilterOnProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,3 @@
+SELECT [e].[Id]
+FROM [Entity] AS [e]
+WHERE [e].[Id] = 1
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.SelectComplexProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.SelectComplexProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..a3cb54d
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.SelectComplexProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id] * 2
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.SelectProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.SelectProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..b1c3b32
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatefullSimpleFunctionTests.SelectProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id]
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessComplexFunctionTests.FilterOnProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessComplexFunctionTests.FilterOnProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..414107b
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessComplexFunctionTests.FilterOnProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,3 @@
+SELECT [e].[Id]
+FROM [Entity] AS [e]
+WHERE 0 = 1
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessComplexFunctionTests.PassInVariableArguments.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessComplexFunctionTests.PassInVariableArguments.DotNet9_0.verified.txt
new file mode 100644
index 0000000..bd6408a
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessComplexFunctionTests.PassInVariableArguments.DotNet9_0.verified.txt
@@ -0,0 +1,4 @@
+DECLARE @__argument_0 int = 1;
+
+SELECT @__argument_0
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessComplexFunctionTests.SelectProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessComplexFunctionTests.SelectProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..6e1334a
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessComplexFunctionTests.SelectProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT 0
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessSimpleFunctionTests.FilterOnProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessSimpleFunctionTests.FilterOnProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..414107b
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessSimpleFunctionTests.FilterOnProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,3 @@
+SELECT [e].[Id]
+FROM [Entity] AS [e]
+WHERE 0 = 1
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessSimpleFunctionTests.SelectProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessSimpleFunctionTests.SelectProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..6e1334a
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StatelessSimpleFunctionTests.SelectProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT 0
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/StaticMembersTests.FilterOnProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StaticMembersTests.FilterOnProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..0b1b60a
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/StaticMembersTests.FilterOnProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,3 @@
+SELECT [e].[Id], [e].[Price]
+FROM [Entity] AS [e]
+WHERE [e].[Price] > 1.0E0
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/TypeNameQualificationTests.SelectProjectableProperty.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/TypeNameQualificationTests.SelectProjectableProperty.DotNet9_0.verified.txt
new file mode 100644
index 0000000..9eb7350
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/TypeNameQualificationTests.SelectProjectableProperty.DotNet9_0.verified.txt
@@ -0,0 +1,10 @@
+SELECT [e2].[Id], [e2].[EntityId], [e2].[ParentId]
+FROM [Entity] AS [e]
+LEFT JOIN (
+ SELECT [e1].[Id], [e1].[EntityId], [e1].[ParentId]
+ FROM (
+ SELECT [e0].[Id], [e0].[EntityId], [e0].[ParentId], ROW_NUMBER() OVER(PARTITION BY [e0].[EntityId] ORDER BY [e0].[Id]) AS [row]
+ FROM [Entity] AS [e0]
+ ) AS [e1]
+ WHERE [e1].[row] <= 1
+) AS [e2] ON [e].[Id] = [e2].[EntityId]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/UseMemberBodyPropertyTests.UseMemberPropertyExpression.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/UseMemberBodyPropertyTests.UseMemberPropertyExpression.DotNet9_0.verified.txt
new file mode 100644
index 0000000..a7fa9cd
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/UseMemberBodyPropertyTests.UseMemberPropertyExpression.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id] * 3
+FROM [Entity] AS [e]
\ No newline at end of file
diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/UseMemberBodyPropertyTests.UseMemberPropertyGenerated.DotNet9_0.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/UseMemberBodyPropertyTests.UseMemberPropertyGenerated.DotNet9_0.verified.txt
new file mode 100644
index 0000000..a3cb54d
--- /dev/null
+++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/UseMemberBodyPropertyTests.UseMemberPropertyGenerated.DotNet9_0.verified.txt
@@ -0,0 +1,2 @@
+SELECT [e].[Id] * 2
+FROM [Entity] AS [e]
\ No newline at end of file