From 77d22ac11533d9b4ad5de43464db3ced1024f5b3 Mon Sep 17 00:00:00 2001 From: maca88 Date: Thu, 4 Feb 2021 21:29:12 +0100 Subject: [PATCH 1/4] =?UTF-8?q?Fix=20subquery=20"Item=20with=20Same=20Key?= =?UTF-8?q?=20has=20already=20been=20added=E2=80=9D=20exception=20for=20Li?= =?UTF-8?q?nq=20provider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Northwind/Entities/Order.cs | 4 +++- .../Northwind/Mappings/Order.hbm.xml | 5 ++++- src/NHibernate.Test/Async/Linq/WhereTests.cs | 16 ++++++++++++++++ src/NHibernate.Test/Linq/WhereTests.cs | 16 ++++++++++++++++ .../Visitors/HqlGeneratorExpressionVisitor.cs | 4 ++-- 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/NHibernate.DomainModel/Northwind/Entities/Order.cs b/src/NHibernate.DomainModel/Northwind/Entities/Order.cs index ea01182d4c5..cdf7f7387a5 100755 --- a/src/NHibernate.DomainModel/Northwind/Entities/Order.cs +++ b/src/NHibernate.DomainModel/Northwind/Entities/Order.cs @@ -47,6 +47,8 @@ public virtual DateTime? OrderDate set { _orderDate = value; } } + public virtual DateTime RequiredOrderDate { get; set; } + public virtual DateTime? RequiredDate { get { return _requiredDate; } @@ -106,4 +108,4 @@ public virtual void RemoveOrderLine(OrderLine orderLine) } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.DomainModel/Northwind/Mappings/Order.hbm.xml b/src/NHibernate.DomainModel/Northwind/Mappings/Order.hbm.xml index efae7f61cb9..1b879d0c37c 100755 --- a/src/NHibernate.DomainModel/Northwind/Mappings/Order.hbm.xml +++ b/src/NHibernate.DomainModel/Northwind/Mappings/Order.hbm.xml @@ -17,6 +17,9 @@ + + + @@ -60,4 +63,4 @@ - \ No newline at end of file + diff --git a/src/NHibernate.Test/Async/Linq/WhereTests.cs b/src/NHibernate.Test/Async/Linq/WhereTests.cs index 3afa7cda451..55f7b4c2933 100644 --- a/src/NHibernate.Test/Async/Linq/WhereTests.cs +++ b/src/NHibernate.Test/Async/Linq/WhereTests.cs @@ -848,6 +848,22 @@ public async Task ContainsOnPersistedCollectionAsync() Assert.That(result.SerialNumber, Is.EqualTo("1121")); } + [Test] + public async Task CanCompareAggregateResultAsync() + { + await (session.Query() + .Select(o => new AggregateDate { Id = o.CustomerId, MaxDate = o.Orders.Max(l => l.RequiredOrderDate)}) + .Where(o => o.MaxDate <= DateTime.Today && o.MaxDate >= DateTime.Today) + .ToListAsync()); + } + + private class AggregateDate + { + public string Id { get; set; } + + public DateTime? MaxDate { get; set; } + } + private static List CanUseCompareInQueryDataSource() { return new List diff --git a/src/NHibernate.Test/Linq/WhereTests.cs b/src/NHibernate.Test/Linq/WhereTests.cs index f991df12030..76519f24641 100644 --- a/src/NHibernate.Test/Linq/WhereTests.cs +++ b/src/NHibernate.Test/Linq/WhereTests.cs @@ -849,6 +849,22 @@ public void ContainsOnPersistedCollection() Assert.That(result.SerialNumber, Is.EqualTo("1121")); } + [Test] + public void CanCompareAggregateResult() + { + session.Query() + .Select(o => new AggregateDate { Id = o.CustomerId, MaxDate = o.Orders.Max(l => l.RequiredOrderDate)}) + .Where(o => o.MaxDate <= DateTime.Today && o.MaxDate >= DateTime.Today) + .ToList(); + } + + private class AggregateDate + { + public string Id { get; set; } + + public DateTime? MaxDate { get; set; } + } + private static List CanUseCompareInQueryDataSource() { return new List diff --git a/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionVisitor.cs b/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionVisitor.cs index 0022897b09f..68905751655 100644 --- a/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionVisitor.cs +++ b/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionVisitor.cs @@ -317,8 +317,8 @@ protected HqlTreeNode VisitBinaryExpression(BinaryExpression expression) var rightType = GetExpressionType(expression.Right); if (leftType != null && leftType == rightType) { - _notCastableExpressions.Add(expression.Left, leftType); - _notCastableExpressions.Add(expression.Right, rightType); + _notCastableExpressions.TryAdd(expression.Left, leftType); + _notCastableExpressions.TryAdd(expression.Right, rightType); } if (expression.NodeType == ExpressionType.Equal) From 48afee552bb53ca8915da627aa6c60a00dd8156a Mon Sep 17 00:00:00 2001 From: maca88 Date: Thu, 4 Feb 2021 23:00:55 +0100 Subject: [PATCH 2/4] Fix build --- src/NHibernate/Util/DictionaryExtensions.cs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/NHibernate/Util/DictionaryExtensions.cs diff --git a/src/NHibernate/Util/DictionaryExtensions.cs b/src/NHibernate/Util/DictionaryExtensions.cs new file mode 100644 index 00000000000..f9b5e23c3a9 --- /dev/null +++ b/src/NHibernate/Util/DictionaryExtensions.cs @@ -0,0 +1,20 @@ +#if NETSTANDARD2_0 || NETFX +using System.Collections.Generic; + +namespace NHibernate.Util +{ + internal static class DictionaryExtensions + { + public static bool TryAdd(this IDictionary dictionary, TKey key, TValue value) + { + if (dictionary.ContainsKey(key)) + { + return false; + } + + dictionary.Add(key, value); + return true; + } + } +} +#endif From deeb280f89dd59e736c593ddad19900eb9903d24 Mon Sep 17 00:00:00 2001 From: maca88 Date: Fri, 5 Feb 2021 21:43:15 +0100 Subject: [PATCH 3/4] Fix tests --- src/NHibernate.DomainModel/Northwind/Mappings/Order.hbm.xml | 2 +- src/NHibernate.Test/Async/Linq/WhereTests.cs | 5 +++++ src/NHibernate.Test/Linq/WhereTests.cs | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/NHibernate.DomainModel/Northwind/Mappings/Order.hbm.xml b/src/NHibernate.DomainModel/Northwind/Mappings/Order.hbm.xml index 1b879d0c37c..b0fa0c4949f 100755 --- a/src/NHibernate.DomainModel/Northwind/Mappings/Order.hbm.xml +++ b/src/NHibernate.DomainModel/Northwind/Mappings/Order.hbm.xml @@ -18,7 +18,7 @@ access="field.camelcase-underscore"/> - + diff --git a/src/NHibernate.Test/Async/Linq/WhereTests.cs b/src/NHibernate.Test/Async/Linq/WhereTests.cs index 55f7b4c2933..b357edc1c82 100644 --- a/src/NHibernate.Test/Async/Linq/WhereTests.cs +++ b/src/NHibernate.Test/Async/Linq/WhereTests.cs @@ -851,6 +851,11 @@ public async Task ContainsOnPersistedCollectionAsync() [Test] public async Task CanCompareAggregateResultAsync() { + if (!Dialect.SupportsScalarSubSelects) + { + Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + } + await (session.Query() .Select(o => new AggregateDate { Id = o.CustomerId, MaxDate = o.Orders.Max(l => l.RequiredOrderDate)}) .Where(o => o.MaxDate <= DateTime.Today && o.MaxDate >= DateTime.Today) diff --git a/src/NHibernate.Test/Linq/WhereTests.cs b/src/NHibernate.Test/Linq/WhereTests.cs index 76519f24641..78c5290064e 100644 --- a/src/NHibernate.Test/Linq/WhereTests.cs +++ b/src/NHibernate.Test/Linq/WhereTests.cs @@ -852,6 +852,11 @@ public void ContainsOnPersistedCollection() [Test] public void CanCompareAggregateResult() { + if (!Dialect.SupportsScalarSubSelects) + { + Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + } + session.Query() .Select(o => new AggregateDate { Id = o.CustomerId, MaxDate = o.Orders.Max(l => l.RequiredOrderDate)}) .Where(o => o.MaxDate <= DateTime.Today && o.MaxDate >= DateTime.Today) From 292f44855e1ed11fc9ad44632b42f745ed7a0441 Mon Sep 17 00:00:00 2001 From: maca88 Date: Wed, 10 Feb 2021 21:34:51 +0100 Subject: [PATCH 4/4] Replace Add with Set --- .../Visitors/HqlGeneratorExpressionVisitor.cs | 4 ++-- src/NHibernate/Util/DictionaryExtensions.cs | 20 ------------------- 2 files changed, 2 insertions(+), 22 deletions(-) delete mode 100644 src/NHibernate/Util/DictionaryExtensions.cs diff --git a/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionVisitor.cs b/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionVisitor.cs index 68905751655..2a285ff5311 100644 --- a/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionVisitor.cs +++ b/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionVisitor.cs @@ -317,8 +317,8 @@ protected HqlTreeNode VisitBinaryExpression(BinaryExpression expression) var rightType = GetExpressionType(expression.Right); if (leftType != null && leftType == rightType) { - _notCastableExpressions.TryAdd(expression.Left, leftType); - _notCastableExpressions.TryAdd(expression.Right, rightType); + _notCastableExpressions[expression.Left] = leftType; + _notCastableExpressions[expression.Right] = rightType; } if (expression.NodeType == ExpressionType.Equal) diff --git a/src/NHibernate/Util/DictionaryExtensions.cs b/src/NHibernate/Util/DictionaryExtensions.cs deleted file mode 100644 index f9b5e23c3a9..00000000000 --- a/src/NHibernate/Util/DictionaryExtensions.cs +++ /dev/null @@ -1,20 +0,0 @@ -#if NETSTANDARD2_0 || NETFX -using System.Collections.Generic; - -namespace NHibernate.Util -{ - internal static class DictionaryExtensions - { - public static bool TryAdd(this IDictionary dictionary, TKey key, TValue value) - { - if (dictionary.ContainsKey(key)) - { - return false; - } - - dictionary.Add(key, value); - return true; - } - } -} -#endif