diff --git a/Build/linq2db.Default.props b/Build/linq2db.Default.props index c61b5fc..edeb2b9 100644 --- a/Build/linq2db.Default.props +++ b/Build/linq2db.Default.props @@ -1,6 +1,6 @@  - 6.6.0 + 6.7.0 Svyatoslav Danyliv, Igor Tkachev, Dmitry Lukashenko, Ilya Chudin Linq to DB diff --git a/Directory.Packages.props b/Directory.Packages.props index a01a8ac..85ac868 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -5,8 +5,8 @@ - - + + diff --git a/NuGet/linq2db.EntityFrameworkCore.nuspec b/NuGet/linq2db.EntityFrameworkCore.nuspec index 2114926..dadd5c6 100644 --- a/NuGet/linq2db.EntityFrameworkCore.nuspec +++ b/NuGet/linq2db.EntityFrameworkCore.nuspec @@ -16,7 +16,7 @@ - + diff --git a/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs b/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs index 7d22dc1..f7d45b7 100644 --- a/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs +++ b/Source/LinqToDB.EntityFrameworkCore/LinqToDBForEFToolsImplDefault.cs @@ -767,12 +767,24 @@ public virtual Expression TransformExpression(Expression expression, IDataContex var tracking = true; var ignoreTracking = false; + var nonEvaluatableParameters = new HashSet(); + TransformInfo LocalTransform(Expression e) { e = CompactExpression(e); switch (e.NodeType) { + case ExpressionType.Lambda: + { + foreach (var parameter in ((LambdaExpression)e).Parameters) + { + nonEvaluatableParameters.Add(parameter); + } + + break; + } + case ExpressionType.Constant: { if (dc != null && typeof(EntityQueryable<>).IsSameOrParentOf(e.Type) || typeof(DbSet<>).IsSameOrParentOf(e.Type)) @@ -905,14 +917,18 @@ TransformInfo LocalTransform(Expression e) if (typeof(IQueryable<>).IsSameOrParentOf(methodCall.Type)) { - // Invoking function to evaluate EF's Subquery located in function - - var obj = EvaluateExpression(methodCall.Object); - var arguments = methodCall.Arguments.Select(EvaluateExpression).ToArray(); - if (methodCall.Method.Invoke(obj, arguments) is IQueryable result) + if (null == methodCall.Find(nonEvaluatableParameters, + (c, t) => t.NodeType == ExpressionType.Parameter && c.Contains(t))) { - if (!ExpressionEqualityComparer.Instance.Equals(methodCall, result.Expression)) - return new TransformInfo(result.Expression, false, true); + // Invoking function to evaluate EF's Subquery located in function + + var obj = EvaluateExpression(methodCall.Object); + var arguments = methodCall.Arguments.Select(EvaluateExpression).ToArray(); + if (methodCall.Method.Invoke(obj, arguments) is IQueryable result) + { + if (!ExpressionEqualityComparer.Instance.Equals(methodCall, result.Expression)) + return new TransformInfo(result.Expression, false, true); + } } } diff --git a/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/NpgSqlTests.cs b/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/NpgSqlTests.cs index b4d275c..13361a7 100644 --- a/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/NpgSqlTests.cs +++ b/Tests/LinqToDB.EntityFrameworkCore.PostgreSQL.Tests/NpgSqlTests.cs @@ -87,5 +87,23 @@ where Sql.Ext.PostgreSQL().Overlaps(m.Guids, guids) } } + [Test] + public void TestUnnest() + { + using var db = CreateNpgSqlEntitiesContext(); + using var dc = db.CreateLinqToDbConnection(); + + var guids = new Guid[] { Guid.Parse("271425b1-ebe8-400d-b71d-a6e47a460ae3"), + Guid.Parse("b75de94e-6d7b-4c70-bfa1-f8639a6a5b35") }; + + var query = + from m in db.EntityWithArrays.ToLinqToDBTable() + from g in dc.Unnest(m.Guids) + where Sql.Ext.PostgreSQL().Overlaps(m.Guids, guids) + select m; + + query.Invoking(q => q.ToArray()).Should().NotThrow(); + } + } } diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 7525955..dcdaac8 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,8 +1,8 @@ variables: solution: 'linq2db.EFCore.sln' build_configuration: 'Release' - assemblyVersion: 6.6.0 - nugetVersion: 6.6.1 + assemblyVersion: 6.7.0 + nugetVersion: 6.7.0 artifact_nugets: 'nugets' # build on commits to important branches (master + release branches): @@ -25,7 +25,7 @@ stages: jobs: - job: build_job pool: - vmImage: 'windows-2019' + vmImage: 'windows-2022' variables: packageVersion: $(nugetVersion) displayName: 'Build'