From 0dacfadb78acb12e99f5e5f3c4d180e08e90d4c5 Mon Sep 17 00:00:00 2001 From: Diego Bonura Date: Tue, 4 Mar 2025 22:53:24 +0100 Subject: [PATCH 1/6] Support JsonOverlaps function --- .../MySqlJsonDbFunctionsExtensions.cs | 14 ++++ .../MySqlJsonDbFunctionsTranslator.cs | 5 ++ .../Query/JsonMicrosoftDomQueryTest.cs | 66 ++++++++++++++++++- .../Query/JsonNewtonsoftDomQueryTest.cs | 66 ++++++++++++++++++- 4 files changed, 149 insertions(+), 2 deletions(-) diff --git a/src/EFCore.MySql/Extensions/MySqlJsonDbFunctionsExtensions.cs b/src/EFCore.MySql/Extensions/MySqlJsonDbFunctionsExtensions.cs index 78fe53fcf..721ce8c17 100644 --- a/src/EFCore.MySql/Extensions/MySqlJsonDbFunctionsExtensions.cs +++ b/src/EFCore.MySql/Extensions/MySqlJsonDbFunctionsExtensions.cs @@ -84,6 +84,20 @@ public static T JsonExtract( [NotNull] params string[] paths) => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(JsonExtract))); + /// + /// Checks if overlaps . + /// + /// DbFunctions instance + /// + /// A JSON column or value. Can be a JSON DOM object, a string property mapped to JSON, or a user POCO mapped to JSON. + /// + /// + /// A JSON column or value. Can be a JSON DOM object, a string, or a user POCO mapped to JSON. + /// + public static bool JsonOverlaps( + [CanBeNull] this DbFunctions _, [NotNull] object json, [NotNull] object candidate) + => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(JsonOverlaps))); + /// /// Checks if contains . /// diff --git a/src/EFCore.MySql/Query/ExpressionTranslators/Internal/MySqlJsonDbFunctionsTranslator.cs b/src/EFCore.MySql/Query/ExpressionTranslators/Internal/MySqlJsonDbFunctionsTranslator.cs index 0e4e4d73e..09ca9ef84 100644 --- a/src/EFCore.MySql/Query/ExpressionTranslators/Internal/MySqlJsonDbFunctionsTranslator.cs +++ b/src/EFCore.MySql/Query/ExpressionTranslators/Internal/MySqlJsonDbFunctionsTranslator.cs @@ -90,6 +90,11 @@ public virtual SqlExpression Translate( method.ReturnType, _sqlExpressionFactory.FindMapping(method.ReturnType, "json"), false), + nameof(MySqlJsonDbFunctionsExtensions.JsonOverlaps) + => _sqlExpressionFactory.NullableFunction( + "JSON_OVERLAPS", + new[] { Json(args[0]), args[1] }, + typeof(bool)), nameof(MySqlJsonDbFunctionsExtensions.JsonContains) => _sqlExpressionFactory.NullableFunction( "JSON_CONTAINS", diff --git a/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs b/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs index b1cf25b17..ea9cf6eb0 100644 --- a/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs +++ b/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs @@ -24,7 +24,7 @@ public JsonMicrosoftDomQueryTest(JsonMicrosoftDomQueryFixture fixture, ITestOutp { Fixture = fixture; Fixture.TestSqlLoggerFactory.Clear(); - //Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper); + Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper); } [Fact] @@ -320,6 +320,70 @@ WHERE JSON_UNQUOTE(`j`.`CustomerElement`) = 'foo' #region Functions + [Fact] + public void JsonOverlaps_with_json_element() + { + using var ctx = CreateContext(); + var element = JsonDocument.Parse(@"{""Name"": ""Joe"", ""Age"": -1}").RootElement; + var count = ctx.JsonEntities.Count(e => + EF.Functions.JsonOverlaps(e.CustomerElement, element)); + + Assert.Equal(1, count); + AssertSql( + $@"@__element_1='{{""Name"":""Joe"",""Age"":-1}}' (Nullable = false) (Size = 4000) + +SELECT COUNT(*) +FROM `JsonEntities` AS `j` +WHERE JSON_OVERLAPS(`j`.`CustomerElement`, {InsertJsonConvert("@__element_1")})"); + } + + [Fact] + public void JsonOverlaps_with_string() + { + using var ctx = CreateContext(); + var count = ctx.JsonEntities.Count(e => + EF.Functions.JsonOverlaps(e.CustomerElement, @"{""Name"": ""Joe"", ""Age"": -1}")); + + Assert.Equal(1, count); + AssertSql( + @"SELECT COUNT(*) +FROM `JsonEntities` AS `j` +WHERE JSON_OVERLAPS(`j`.`CustomerElement`, '{""Name"": ""Joe"", ""Age"": -1}')"); + } + + [Fact] + public void JsonOverlaps_using_JsonExtract_with_json_element() + { + using var ctx = CreateContext(); + var element = JsonDocument.Parse(@"[3,-1]").RootElement; + var count = ctx.JsonEntities.Count(e => + EF.Functions.JsonOverlaps(EF.Functions.JsonExtract(e.CustomerElement, "$.Statistics.Nested.IntArray"), element)); + + Assert.Equal(1, count); + var dd = InsertJsonConvert("@__element_1") ; + AssertSql( + $@"@__element_1='[3,-1]' (Nullable = false) (Size = 4000) + +SELECT COUNT(*) +FROM `JsonEntities` AS `j` +WHERE JSON_OVERLAPS(JSON_EXTRACT(`j`.`CustomerElement`, '$.Statistics.Nested.IntArray'), {InsertJsonConvert("@__element_1")})"); + } + + [Fact] + public void JsonOverlaps_using_JsonExtract_with_json_string() + { + using var ctx = CreateContext(); + var count = ctx.JsonEntities.Count(e => + EF.Functions.JsonOverlaps(EF.Functions.JsonExtract(e.CustomerElement, "$.Statistics.Nested.IntArray"), @"[3,-1]")); + + Assert.Equal(1, count); + var dd = InsertJsonConvert("@__element_1"); + AssertSql( + $@"SELECT COUNT(*) +FROM `JsonEntities` AS `j` +WHERE JSON_OVERLAPS(JSON_EXTRACT(`j`.`CustomerElement`, '$.Statistics.Nested.IntArray'), '[3,-1]')"); + } + [Fact] public void JsonContains_with_json_element() { diff --git a/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs b/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs index c5ae525c8..0a236f8d9 100644 --- a/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs +++ b/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs @@ -346,7 +346,71 @@ WHERE JSON_UNQUOTE(`j`.`CustomerJToken`) = 'foo' LIMIT 2"); } - #region Functions + #region Functions + + [Fact] + public void JsonOverlaps_with_json_element() + { + using var ctx = CreateContext(); + var element = JObject.Parse(@"{""Name"": ""Joe"", ""Age"": -1}").Root; + var count = ctx.JsonEntities.Count(e => + EF.Functions.JsonOverlaps(e.CustomerJToken, element)); + + Assert.Equal(1, count); + AssertSql( + $@"@__element_1='{{""Name"":""Joe"",""Age"":-1}}' (Size = 4000) + +SELECT COUNT(*) +FROM `JsonEntities` AS `j` +WHERE JSON_OVERLAPS(`j`.`CustomerJToken`, {InsertJsonConvert("@__element_1")})"); + } + + [Fact] + public void JsonOverlaps_with_string() + { + using var ctx = CreateContext(); + var count = ctx.JsonEntities.Count(e => + EF.Functions.JsonOverlaps(e.CustomerJToken, @"{""Name"": ""Joe"", ""Age"": -1}")); + + Assert.Equal(1, count); + AssertSql( + @"SELECT COUNT(*) +FROM `JsonEntities` AS `j` +WHERE JSON_OVERLAPS(`j`.`CustomerJToken`, '{""Name"": ""Joe"", ""Age"": -1}')"); + } + + [Fact] +\ public void JsonOverlaps_using_JsonExtract_with_json_element() + { + using var ctx = CreateContext(); + var element = JArray.Parse(@"[3,-1]"); + var count = ctx.JsonEntities.Count(e => + EF.Functions.JsonOverlaps(EF.Functions.JsonExtract(e.CustomerJToken, "$.Statistics.Nested.IntArray"), element)); + + Assert.Equal(1, count); + var dd = InsertJsonConvert("@__element_1"); + AssertSql( + $@"@__element_1='[3,-1]' (Size = 4000) + +SELECT COUNT(*) +FROM `JsonEntities` AS `j` +WHERE JSON_OVERLAPS(JSON_EXTRACT(`j`.`CustomerJToken`, '$.Statistics.Nested.IntArray'), {InsertJsonConvert("@__element_1")})"); + } + + [Fact] + public void JsonOverlaps_using_JsonExtract_with_json_string() + { + using var ctx = CreateContext(); + var count = ctx.JsonEntities.Count(e => + EF.Functions.JsonOverlaps(EF.Functions.JsonExtract(e.CustomerJToken, "$.Statistics.Nested.IntArray"), @"[3,-1]")); + + Assert.Equal(1, count); + var dd = InsertJsonConvert("@__element_1"); + AssertSql( + $@"SELECT COUNT(*) +FROM `JsonEntities` AS `j` +WHERE JSON_OVERLAPS(JSON_EXTRACT(`j`.`CustomerJToken`, '$.Statistics.Nested.IntArray'), '[3,-1]')"); + } [Fact] public void JsonContains_with_json_element() From eb311d274cbc399584e103f71315c8db298d7d5c Mon Sep 17 00:00:00 2001 From: Diego Bonura Date: Tue, 4 Mar 2025 22:55:05 +0100 Subject: [PATCH 2/6] Remove test logging fixture helper call --- .../Query/JsonMicrosoftDomQueryTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs b/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs index ea9cf6eb0..d237fefeb 100644 --- a/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs +++ b/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs @@ -24,7 +24,7 @@ public JsonMicrosoftDomQueryTest(JsonMicrosoftDomQueryFixture fixture, ITestOutp { Fixture = fixture; Fixture.TestSqlLoggerFactory.Clear(); - Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper); + //Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper); } [Fact] From 52fcb01bf64f050d9a69cfc83204a1d485c0355b Mon Sep 17 00:00:00 2001 From: Diego Bonura Date: Tue, 4 Mar 2025 22:59:03 +0100 Subject: [PATCH 3/6] Fix typo error --- .../Query/JsonNewtonsoftDomQueryTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs b/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs index 0a236f8d9..f0ab0d2b5 100644 --- a/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs +++ b/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs @@ -380,7 +380,7 @@ public void JsonOverlaps_with_string() } [Fact] -\ public void JsonOverlaps_using_JsonExtract_with_json_element() + public void JsonOverlaps_using_JsonExtract_with_json_element() { using var ctx = CreateContext(); var element = JArray.Parse(@"[3,-1]"); From 785a1dc583e790bb44d84aeb81d62c0ec84d0c9e Mon Sep 17 00:00:00 2001 From: Diego Bonura Date: Sat, 8 Mar 2025 16:07:49 +0100 Subject: [PATCH 4/6] Introduce JsonOverlaps version flag --- .../Infrastructure/MariaDbServerVersion.cs | 1 + .../Infrastructure/MySqlServerVersion.cs | 1 + .../Infrastructure/ServerVersionSupport.cs | 1 + .../Query/JsonMicrosoftDomQueryTest.cs | 12 ++++++++---- .../Query/JsonNewtonsoftDomQueryTest.cs | 12 ++++++++---- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/EFCore.MySql/Infrastructure/MariaDbServerVersion.cs b/src/EFCore.MySql/Infrastructure/MariaDbServerVersion.cs index f3025d9da..c5f55d110 100644 --- a/src/EFCore.MySql/Infrastructure/MariaDbServerVersion.cs +++ b/src/EFCore.MySql/Infrastructure/MariaDbServerVersion.cs @@ -93,6 +93,7 @@ internal MariaDbServerVersionSupport([NotNull] ServerVersion serverVersion) public override bool LimitWithNonConstantValue => false; public override bool JsonTable => ServerVersion.Version >= new Version(10, 6, 0); // Since there seems to be no implicit LATERAL support for JSON_TABLE, this is pretty useless except for cases where the JSON is provided by a parameter instead of a column of an outer table. public override bool JsonValue => true; + public override bool JsonOverlaps => ServerVersion.Version >= new Version(10, 9, 0); public override bool Values => ServerVersion.Version >= new Version(10, 3, 3); public override bool ValuesWithRows => false; public override bool WhereSubqueryReferencesOuterQuery => false; diff --git a/src/EFCore.MySql/Infrastructure/MySqlServerVersion.cs b/src/EFCore.MySql/Infrastructure/MySqlServerVersion.cs index c0c548e7c..d6d042bc7 100644 --- a/src/EFCore.MySql/Infrastructure/MySqlServerVersion.cs +++ b/src/EFCore.MySql/Infrastructure/MySqlServerVersion.cs @@ -94,6 +94,7 @@ internal MySqlServerVersionSupport([NotNull] ServerVersion serverVersion) public override bool LimitWithNonConstantValue => false; public override bool JsonTable => ServerVersion.Version >= new Version(8, 0, 4); public override bool JsonValue => ServerVersion.Version >= new Version(8, 0, 21); + public override bool JsonOverlaps => ServerVersion.Version >= new Version(8, 0, 0); public override bool Values => false; public override bool ValuesWithRows => ServerVersion.Version >= new Version(8, 0, 19); public override bool WhereSubqueryReferencesOuterQuery => false; diff --git a/src/EFCore.MySql/Infrastructure/ServerVersionSupport.cs b/src/EFCore.MySql/Infrastructure/ServerVersionSupport.cs index a6dfe2c8b..dc0b72a8c 100644 --- a/src/EFCore.MySql/Infrastructure/ServerVersionSupport.cs +++ b/src/EFCore.MySql/Infrastructure/ServerVersionSupport.cs @@ -59,6 +59,7 @@ public virtual bool PropertyOrVersion(string propertyNameOrServerVersion) public virtual bool CrossApply => false; public virtual bool OuterReferenceInMultiLevelSubquery => false; public virtual bool Json => false; + public virtual bool JsonOverlaps => false; public virtual bool GeneratedColumns => false; public virtual bool NullableGeneratedColumns => false; public virtual bool ParenthesisEnclosedGeneratedColumnExpressions => false; diff --git a/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs b/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs index d237fefeb..a7accf62e 100644 --- a/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs +++ b/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs @@ -320,7 +320,8 @@ WHERE JSON_UNQUOTE(`j`.`CustomerElement`) = 'foo' #region Functions - [Fact] + [ConditionalFact] + [SupportedServerVersionCondition(nameof(ServerVersionSupport.JsonOverlaps))] public void JsonOverlaps_with_json_element() { using var ctx = CreateContext(); @@ -337,7 +338,8 @@ SELECT COUNT(*) WHERE JSON_OVERLAPS(`j`.`CustomerElement`, {InsertJsonConvert("@__element_1")})"); } - [Fact] + [ConditionalFact] + [SupportedServerVersionCondition(nameof(ServerVersionSupport.JsonOverlaps))] public void JsonOverlaps_with_string() { using var ctx = CreateContext(); @@ -351,7 +353,8 @@ public void JsonOverlaps_with_string() WHERE JSON_OVERLAPS(`j`.`CustomerElement`, '{""Name"": ""Joe"", ""Age"": -1}')"); } - [Fact] + [ConditionalFact] + [SupportedServerVersionCondition(nameof(ServerVersionSupport.JsonOverlaps))] public void JsonOverlaps_using_JsonExtract_with_json_element() { using var ctx = CreateContext(); @@ -369,7 +372,8 @@ SELECT COUNT(*) WHERE JSON_OVERLAPS(JSON_EXTRACT(`j`.`CustomerElement`, '$.Statistics.Nested.IntArray'), {InsertJsonConvert("@__element_1")})"); } - [Fact] + [ConditionalFact] + [SupportedServerVersionCondition(nameof(ServerVersionSupport.JsonOverlaps))] public void JsonOverlaps_using_JsonExtract_with_json_string() { using var ctx = CreateContext(); diff --git a/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs b/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs index f0ab0d2b5..cd92e067a 100644 --- a/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs +++ b/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs @@ -348,7 +348,8 @@ WHERE JSON_UNQUOTE(`j`.`CustomerJToken`) = 'foo' #region Functions - [Fact] + [ConditionalFact] + [SupportedServerVersionCondition(nameof(ServerVersionSupport.JsonOverlaps))] public void JsonOverlaps_with_json_element() { using var ctx = CreateContext(); @@ -365,7 +366,8 @@ SELECT COUNT(*) WHERE JSON_OVERLAPS(`j`.`CustomerJToken`, {InsertJsonConvert("@__element_1")})"); } - [Fact] + [ConditionalFact] + [SupportedServerVersionCondition(nameof(ServerVersionSupport.JsonOverlaps))] public void JsonOverlaps_with_string() { using var ctx = CreateContext(); @@ -379,7 +381,8 @@ public void JsonOverlaps_with_string() WHERE JSON_OVERLAPS(`j`.`CustomerJToken`, '{""Name"": ""Joe"", ""Age"": -1}')"); } - [Fact] + [ConditionalFact] + [SupportedServerVersionCondition(nameof(ServerVersionSupport.JsonOverlaps))] public void JsonOverlaps_using_JsonExtract_with_json_element() { using var ctx = CreateContext(); @@ -397,7 +400,8 @@ SELECT COUNT(*) WHERE JSON_OVERLAPS(JSON_EXTRACT(`j`.`CustomerJToken`, '$.Statistics.Nested.IntArray'), {InsertJsonConvert("@__element_1")})"); } - [Fact] + [ConditionalFact] + [SupportedServerVersionCondition(nameof(ServerVersionSupport.JsonOverlaps))] public void JsonOverlaps_using_JsonExtract_with_json_string() { using var ctx = CreateContext(); From aa5a0170e917903f4c4c4033ac89aa2b1eaddd9c Mon Sep 17 00:00:00 2001 From: Diego Bonura Date: Mon, 10 Mar 2025 08:16:38 +0100 Subject: [PATCH 5/6] Removal of unused code --- .../Query/JsonMicrosoftDomQueryTest.cs | 2 -- .../Query/JsonNewtonsoftDomQueryTest.cs | 2 -- 2 files changed, 4 deletions(-) diff --git a/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs b/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs index a7accf62e..c5494e442 100644 --- a/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs +++ b/test/EFCore.MySql.FunctionalTests/Query/JsonMicrosoftDomQueryTest.cs @@ -363,7 +363,6 @@ public void JsonOverlaps_using_JsonExtract_with_json_element() EF.Functions.JsonOverlaps(EF.Functions.JsonExtract(e.CustomerElement, "$.Statistics.Nested.IntArray"), element)); Assert.Equal(1, count); - var dd = InsertJsonConvert("@__element_1") ; AssertSql( $@"@__element_1='[3,-1]' (Nullable = false) (Size = 4000) @@ -381,7 +380,6 @@ public void JsonOverlaps_using_JsonExtract_with_json_string() EF.Functions.JsonOverlaps(EF.Functions.JsonExtract(e.CustomerElement, "$.Statistics.Nested.IntArray"), @"[3,-1]")); Assert.Equal(1, count); - var dd = InsertJsonConvert("@__element_1"); AssertSql( $@"SELECT COUNT(*) FROM `JsonEntities` AS `j` diff --git a/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs b/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs index cd92e067a..dad8e037d 100644 --- a/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs +++ b/test/EFCore.MySql.FunctionalTests/Query/JsonNewtonsoftDomQueryTest.cs @@ -391,7 +391,6 @@ public void JsonOverlaps_using_JsonExtract_with_json_element() EF.Functions.JsonOverlaps(EF.Functions.JsonExtract(e.CustomerJToken, "$.Statistics.Nested.IntArray"), element)); Assert.Equal(1, count); - var dd = InsertJsonConvert("@__element_1"); AssertSql( $@"@__element_1='[3,-1]' (Size = 4000) @@ -409,7 +408,6 @@ public void JsonOverlaps_using_JsonExtract_with_json_string() EF.Functions.JsonOverlaps(EF.Functions.JsonExtract(e.CustomerJToken, "$.Statistics.Nested.IntArray"), @"[3,-1]")); Assert.Equal(1, count); - var dd = InsertJsonConvert("@__element_1"); AssertSql( $@"SELECT COUNT(*) FROM `JsonEntities` AS `j` From 78457cd97313579f03eec85bd402116a6efd5cd6 Mon Sep 17 00:00:00 2001 From: Diego Bonura Date: Mon, 10 Mar 2025 08:21:01 +0100 Subject: [PATCH 6/6] Renamed parameters --- .../Extensions/MySqlJsonDbFunctionsExtensions.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/EFCore.MySql/Extensions/MySqlJsonDbFunctionsExtensions.cs b/src/EFCore.MySql/Extensions/MySqlJsonDbFunctionsExtensions.cs index 721ce8c17..f1bdcfdf7 100644 --- a/src/EFCore.MySql/Extensions/MySqlJsonDbFunctionsExtensions.cs +++ b/src/EFCore.MySql/Extensions/MySqlJsonDbFunctionsExtensions.cs @@ -85,17 +85,17 @@ public static T JsonExtract( => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(JsonExtract))); /// - /// Checks if overlaps . + /// Checks if overlaps . /// /// DbFunctions instance - /// + /// /// A JSON column or value. Can be a JSON DOM object, a string property mapped to JSON, or a user POCO mapped to JSON. /// - /// + /// /// A JSON column or value. Can be a JSON DOM object, a string, or a user POCO mapped to JSON. /// public static bool JsonOverlaps( - [CanBeNull] this DbFunctions _, [NotNull] object json, [NotNull] object candidate) + [CanBeNull] this DbFunctions _, [NotNull] object json1, [NotNull] object json2) => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(JsonOverlaps))); ///