From f2fba673d23366834b064da0d50a14bd3381972e Mon Sep 17 00:00:00 2001
From: 28810 <28810@YEXIANGQIN>
Date: Sun, 12 Jul 2020 20:47:07 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20FreeSql.Provider.Postg?=
=?UTF-8?q?reSQL=20NetTopologySuite=20=E7=B1=BB=E5=9E=8B=E6=98=A0=E5=B0=84?=
=?UTF-8?q?=EF=BC=8C=E4=BF=9D=E7=95=99=20LegacyPostgis=20=E6=98=A0?=
=?UTF-8?q?=E5=B0=84=20#369=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...rovider.PostgreSQL.NetTopologySuite.csproj | 25 +
.../PostgreSQL/PostgreSQLCodeFirstTest.cs | 448 ++++++++++++++++++
.../g.cs | 27 ++
FreeSql.sln | 14 +
.../SelectProvider/Select1Provider.cs | 7 +-
.../FreeSql.Provider.PostgreSQL.csproj | 5 +
.../PostgreSQLCodeFirst.cs | 14 +-
.../PostgreSQLProvider.cs | 14 +
.../PostgreSQLUtils.cs | 26 +-
9 files changed, 569 insertions(+), 11 deletions(-)
create mode 100644 FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite.csproj
create mode 100644 FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/PostgreSQL/PostgreSQLCodeFirstTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/g.cs
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite.csproj b/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite.csproj
new file mode 100644
index 00000000..04119115
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite.csproj
@@ -0,0 +1,25 @@
+
+
+
+ netcoreapp3.1
+
+ false
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
+
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/PostgreSQL/PostgreSQLCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/PostgreSQL/PostgreSQLCodeFirstTest.cs
new file mode 100644
index 00000000..5d0b0a30
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/PostgreSQL/PostgreSQLCodeFirstTest.cs
@@ -0,0 +1,448 @@
+using FreeSql.DataAnnotations;
+using NetTopologySuite.Geometries;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using Npgsql;
+using NpgsqlTypes;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Net;
+using System.Net.NetworkInformation;
+using System.Text;
+using Xunit;
+
+namespace FreeSql.Tests.PostgreSQL.NetTopologySuite
+{
+ public class PostgreSQLCodeFirstTest
+ {
+
+ [Fact]
+ public void GetComparisonDDLStatements()
+ {
+
+ var sql = g.pgsql.CodeFirst.GetComparisonDDLStatements();
+ g.pgsql.Select();
+ }
+
+ IInsert insert => g.pgsql.Insert();
+ ISelect select => g.pgsql.Select();
+
+ [Fact]
+ public void CurdAllField()
+ {
+ var sql1 = select.Where(a => a.testFieldIntArray.Contains(1)).ToSql();
+ var sql2 = select.Where(a => a.testFieldIntArray.Contains(1)).ToSql();
+
+ var item = new TableAllType { };
+ item.Id = (int)insert.AppendData(item).ExecuteIdentity();
+
+ var newitem = select.Where(a => a.Id == item.Id).ToOne();
+
+ var item2 = new TableAllType
+ {
+ testFieldBitArray = new BitArray(Encoding.UTF8.GetBytes("")),
+ testFieldBitArrayArray = new[] { new BitArray(Encoding.UTF8.GetBytes("й")), new BitArray(Encoding.UTF8.GetBytes("")) },
+ testFieldBool = true,
+ testFieldBoolArray = new[] { true, true, false, false },
+ testFieldBoolArrayNullable = new bool?[] { true, true, null, false, false },
+ testFieldBoolNullable = true,
+ testFieldByte = byte.MaxValue,
+ testFieldByteArray = new byte[] { 0, 1, 2, 3, 4, 5, 6 },
+ testFieldByteArrayNullable = new byte?[] { 0, 1, 2, 3, null, 4, 5, 6 },
+ testFieldByteNullable = byte.MinValue,
+ testFieldBytes = Encoding.UTF8.GetBytes("й"),
+ testFieldBytesArray = new[] { Encoding.UTF8.GetBytes("й"), Encoding.UTF8.GetBytes("й") },
+ testFieldCidr = (IPAddress.Parse("10.0.0.0"), 8),
+ testFieldCidrArray = new[] { (IPAddress.Parse("10.0.0.0"), 8), (IPAddress.Parse("192.168.0.0"), 16) },
+ testFieldCidrArrayNullable = new (IPAddress, int)?[] { (IPAddress.Parse("10.0.0.0"), 8), null, (IPAddress.Parse("192.168.0.0"), 16) },
+ testFieldCidrNullable = (IPAddress.Parse("192.168.0.0"), 16),
+ testFieldDateTime = DateTime.Now,
+ testFieldDateTimeArray = new[] { DateTime.Now, DateTime.Now.AddHours(2) },
+ testFieldDateTimeArrayNullable = new DateTime?[] { DateTime.Now, null, DateTime.Now.AddHours(2) },
+ testFieldDateTimeNullable = DateTime.Now.AddDays(-1),
+ testFieldDecimal = 999.99M,
+ testFieldDecimalArray = new[] { 999.91M, 999.92M, 999.93M },
+ testFieldDecimalArrayNullable = new decimal?[] { 998.11M, 998.12M, 998.13M },
+ testFieldDecimalNullable = 111.11M,
+ testFieldDouble = 888.88,
+ testFieldDoubleArray = new[] { 888.81, 888.82, 888.83 },
+ testFieldDoubleArrayNullable = new double?[] { 888.11, 888.12, null, 888.13 },
+ testFieldDoubleNullable = 222.22,
+ testFieldEnum1 = TableAllTypeEnumType1.e3,
+ testFieldEnum1Array = new[] { TableAllTypeEnumType1.e5, TableAllTypeEnumType1.e2, TableAllTypeEnumType1.e1 },
+ testFieldEnum1ArrayNullable = new TableAllTypeEnumType1?[] { TableAllTypeEnumType1.e5, TableAllTypeEnumType1.e2, null, TableAllTypeEnumType1.e1 },
+ testFieldEnum1Nullable = TableAllTypeEnumType1.e2,
+ testFieldEnum2 = TableAllTypeEnumType2.f2,
+ testFieldEnum2Array = new[] { TableAllTypeEnumType2.f3, TableAllTypeEnumType2.f1 },
+ testFieldEnum2ArrayNullable = new TableAllTypeEnumType2?[] { TableAllTypeEnumType2.f3, null, TableAllTypeEnumType2.f1 },
+ testFieldEnum2Nullable = TableAllTypeEnumType2.f3,
+ testFieldFloat = 777.77F,
+ testFieldFloatArray = new[] { 777.71F, 777.72F, 777.73F },
+ testFieldFloatArrayNullable = new float?[] { 777.71F, 777.72F, null, 777.73F },
+ testFieldFloatNullable = 333.33F,
+ testFieldGuid = Guid.NewGuid(),
+ testFieldGuidArray = new[] { Guid.NewGuid(), Guid.NewGuid() },
+ testFieldGuidArrayNullable = new Guid?[] { Guid.NewGuid(), null, Guid.NewGuid() },
+ testFieldGuidNullable = Guid.NewGuid(),
+ testFieldHStore = new Dictionary { { "111", "value111" }, { "222", "value222" }, { "333", "value333" } },
+ testFieldHStoreArray = new[] { new Dictionary { { "111", "value111" }, { "222", "value222" }, { "333", "value333" } }, new Dictionary { { "444", "value444" }, { "555", "value555" }, { "666", "value666" } } },
+ testFieldInet = IPAddress.Parse("192.168.1.1"),
+ testFieldInetArray = new[] { IPAddress.Parse("192.168.1.1"), IPAddress.Parse("192.168.1.2"), IPAddress.Parse("192.168.1.3") },
+ testFieldInt = int.MaxValue,
+ testFieldInt4range = new NpgsqlRange(10, 20),
+ testFieldInt4rangeArray = new[] { new NpgsqlRange(10, 20), new NpgsqlRange(50, 100), new NpgsqlRange(200, 300) },
+ testFieldInt4rangeArrayNullable = new NpgsqlRange?[] { new NpgsqlRange(10, 20), new NpgsqlRange(50, 100), null, new NpgsqlRange(200, 300) },
+ testFieldInt4rangeNullable = new NpgsqlRange(100, 200),
+ testFieldInt8range = new NpgsqlRange(100, 200),
+ testFieldInt8rangeArray = new[] { new NpgsqlRange(100, 200), new NpgsqlRange(500, 1000), new NpgsqlRange(2000, 3000) },
+ testFieldInt8rangeArrayNullable = new NpgsqlRange?[] { new NpgsqlRange(100, 200), new NpgsqlRange(500, 1000), null, new NpgsqlRange(2000, 3000) },
+ testFieldInt8rangeNullable = new NpgsqlRange(1000, 2000),
+ testFieldIntArray = new[] { 1, 2, 3, 4, 5 },
+ testFieldIntArrayNullable = new int?[] { 1, 2, 3, null, 4, 5 },
+ testFieldIntNullable = int.MinValue,
+ testFieldJArray = JArray.Parse("[1,2,3,4,5]"),
+ testFieldJArrayArray = new[] { JArray.Parse("[1,2,3,4,5]"), JArray.Parse("[10,20,30,40,50]") },
+ testFieldJObject = JObject.Parse("{ \"a\":1, \"b\":2, \"c\":3 }"),
+ testFieldJObjectArray = new[] { JObject.Parse("{ \"a\":1, \"b\":2, \"c\":3 }"), JObject.Parse("{ \"a\":10, \"b\":20, \"c\":30 }") },
+ testFieldJToken = JToken.Parse("{ \"a\":1, \"b\":2, \"c\":3, \"d\":[1,2,3,4,5] }"),
+ testFieldJTokenArray = new[] { JToken.Parse("{ \"a\":1, \"b\":2, \"c\":3, \"d\":[1,2,3,4,5] }"), JToken.Parse("{ \"a\":10, \"b\":20, \"c\":30, \"d\":[10,20,30,40,50] }") },
+ testFieldLong = long.MaxValue,
+ testFieldLongArray = new long[] { 10, 20, 30, 40, 50 },
+ testFieldMacaddr = PhysicalAddress.Parse("A1-A2-CD-DD-FF-02"),
+ testFieldMacaddrArray = new[] { PhysicalAddress.Parse("A1-A2-CD-DD-FF-02"), PhysicalAddress.Parse("A2-22-22-22-22-02") },
+ testFieldNpgsqlBox = new NpgsqlBox(10, 100, 100, 10),
+ testFieldNpgsqlBoxArray = new[] { new NpgsqlBox(10, 100, 100, 10), new NpgsqlBox(200, 2000, 2000, 200) },
+ testFieldNpgsqlBoxArrayNullable = new NpgsqlBox?[] { new NpgsqlBox(10, 100, 100, 10), null, new NpgsqlBox(200, 2000, 2000, 200) },
+ testFieldNpgsqlBoxNullable = new NpgsqlBox(200, 2000, 2000, 200),
+ testFieldNpgsqlCircle = new NpgsqlCircle(50, 50, 100),
+ testFieldNpgsqlCircleArray = new[] { new NpgsqlCircle(50, 50, 100), new NpgsqlCircle(80, 80, 100) },
+ testFieldNpgsqlCircleArrayNullable = new NpgsqlCircle?[] { new NpgsqlCircle(50, 50, 100), null, new NpgsqlCircle(80, 80, 100) },
+ testFieldNpgsqlCircleNullable = new NpgsqlCircle(80, 80, 100),
+ testFieldNpgsqlLine = new NpgsqlLine(30, 30, 30),
+ testFieldNpgsqlLineArray = new[] { new NpgsqlLine(30, 30, 30), new NpgsqlLine(35, 35, 35) },
+ testFieldNpgsqlLineArrayNullable = new NpgsqlLine?[] { new NpgsqlLine(30, 30, 30), null, new NpgsqlLine(35, 35, 35) },
+ testFieldNpgsqlLineNullable = new NpgsqlLine(60, 60, 60),
+ testFieldNpgsqlLSeg = new NpgsqlLSeg(80, 10, 800, 20),
+ testFieldNpgsqlLSegArray = new[] { new NpgsqlLSeg(80, 10, 800, 20), new NpgsqlLSeg(180, 20, 260, 50) },
+ testFieldNpgsqlLSegArrayNullable = new NpgsqlLSeg?[] { new NpgsqlLSeg(80, 10, 800, 20), null, new NpgsqlLSeg(180, 20, 260, 50) },
+ testFieldNpgsqlLSegNullable = new NpgsqlLSeg(180, 20, 260, 50),
+ testFieldNpgsqlPath = new NpgsqlPath(new NpgsqlPoint(10, 10), new NpgsqlPoint(15, 10), new NpgsqlPoint(17, 10), new NpgsqlPoint(19, 10)),
+ testFieldNpgsqlPathArray = new[] { new NpgsqlPath(new NpgsqlPoint(10, 10), new NpgsqlPoint(15, 10), new NpgsqlPoint(17, 10), new NpgsqlPoint(19, 10)), new NpgsqlPath(new NpgsqlPoint(210, 10), new NpgsqlPoint(215, 10), new NpgsqlPoint(217, 10), new NpgsqlPoint(219, 10)) },
+ testFieldNpgsqlPathArrayNullable = new NpgsqlPath?[] { new NpgsqlPath(new NpgsqlPoint(10, 10), new NpgsqlPoint(15, 10), new NpgsqlPoint(17, 10), new NpgsqlPoint(19, 10)), null, new NpgsqlPath(new NpgsqlPoint(210, 10), new NpgsqlPoint(215, 10), new NpgsqlPoint(217, 10), new NpgsqlPoint(219, 10)) },
+ testFieldNpgsqlPathNullable = new NpgsqlPath(new NpgsqlPoint(210, 10), new NpgsqlPoint(215, 10), new NpgsqlPoint(217, 10), new NpgsqlPoint(219, 10)),
+ testFieldNpgsqlPoint = new NpgsqlPoint(666, 666),
+ testFieldNpgsqlPointArray = new[] { new NpgsqlPoint(666, 666), new NpgsqlPoint(888, 888) },
+ testFieldNpgsqlPointArrayNullable = new NpgsqlPoint?[] { new NpgsqlPoint(666, 666), null, new NpgsqlPoint(888, 888) },
+ testFieldNpgsqlPointNullable = new NpgsqlPoint(888, 888),
+ testFieldNpgsqlPolygon = new NpgsqlPolygon(new NpgsqlPoint(36, 30), new NpgsqlPoint(36, 50), new NpgsqlPoint(38, 80), new NpgsqlPoint(36, 30)),
+ testFieldNpgsqlPolygonArray = new[] { new NpgsqlPolygon(new NpgsqlPoint(36, 30), new NpgsqlPoint(36, 50), new NpgsqlPoint(38, 80), new NpgsqlPoint(36, 30)), new NpgsqlPolygon(new NpgsqlPoint(136, 130), new NpgsqlPoint(136, 150), new NpgsqlPoint(138, 180), new NpgsqlPoint(136, 130)) },
+ testFieldNpgsqlPolygonArrayNullable = new NpgsqlPolygon?[] { new NpgsqlPolygon(new NpgsqlPoint(36, 30), new NpgsqlPoint(36, 50), new NpgsqlPoint(38, 80), new NpgsqlPoint(36, 30)), null, new NpgsqlPolygon(new NpgsqlPoint(136, 130), new NpgsqlPoint(136, 150), new NpgsqlPoint(138, 180), new NpgsqlPoint(136, 130)) },
+ testFieldNpgsqlPolygonNullable = new NpgsqlPolygon(new NpgsqlPoint(136, 130), new NpgsqlPoint(136, 150), new NpgsqlPoint(138, 180), new NpgsqlPoint(136, 130)),
+ testFieldNumrange = new NpgsqlRange(888.88M, 999.99M),
+ testFieldNumrangeArray = new[] { new NpgsqlRange(888.88M, 999.99M), new NpgsqlRange(18888.88M, 19998.99M) },
+ testFieldNumrangeArrayNullable = new NpgsqlRange?[] { new NpgsqlRange(888.88M, 999.99M), null, new NpgsqlRange(18888.88M, 19998.99M) },
+ testFieldNumrangeNullable = new NpgsqlRange(18888.88M, 19998.99M),
+ testFieldGeometry = new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }) { SRID = 4326 },
+ testFieldGeometryArray = new Geometry[] {
+ new Point(555,551),
+ new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }),
+ new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ new MultiLineString(new[] { new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }), new LineString(new[] { new Coordinate(20, 21), new Coordinate(200, 210) }) }),
+ new MultiPoint(new[] { new Point(20, 21), new Point(210, 220) }),
+ new MultiPolygon(new []{
+ new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ new Polygon(new LinearRing(new[] { new Coordinate(50, 51), new Coordinate(500, 510), new Coordinate(800, 810), new Coordinate(50, 51) }))
+ })
+ },
+ testFieldGeometryCollection = new GeometryCollection(new Geometry[] {
+ new Point(555,551),
+ new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }),
+ new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ new MultiLineString(new[] { new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }), new LineString(new[] { new Coordinate(20, 21), new Coordinate(200, 210) }) }),
+ new MultiPoint(new[] { new Point(20, 21), new Point(210, 220) }),
+ new MultiPolygon(new []{
+ new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ new Polygon(new LinearRing(new[] { new Coordinate(50, 51), new Coordinate(500, 510), new Coordinate(800, 810), new Coordinate(50, 51) }))
+ })
+ }),
+ testFieldGeometryCollectionArray = new[] {
+ new GeometryCollection(new Geometry[] {
+ new Point(555,551),
+ new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }),
+ new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ new MultiLineString(new[] { new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }), new LineString(new[] { new Coordinate(20, 21), new Coordinate(200, 210) }) }),
+ new MultiPoint(new[] { new Point(20, 21), new Point(210, 220) }),
+ new MultiPolygon(new []{
+ new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ new Polygon(new LinearRing(new[] { new Coordinate(50, 51), new Coordinate(500, 510), new Coordinate(800, 810), new Coordinate(50, 51) }))
+ })
+ }),new GeometryCollection(new Geometry[] {
+ new Point(555,551),
+ new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }),
+ new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ new MultiLineString(new[] { new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }), new LineString(new[] { new Coordinate(20, 21), new Coordinate(200, 210) }) }),
+ new MultiPoint(new[] { new Point(20, 21), new Point(210, 220) }),
+ new MultiPolygon(new []{
+ new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ new Polygon(new LinearRing(new[] { new Coordinate(50, 51), new Coordinate(500, 510), new Coordinate(800, 810), new Coordinate(50, 51) }))
+ })
+ })
+ },
+ testFieldLineString = new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }),
+ testFieldLineStringArray = new[] { new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }), new LineString(new[] { new Coordinate(20, 21), new Coordinate(200, 220) }) },
+ testFieldMultiPoint = new MultiPoint(new[] { new Point(20, 21), new Point(210, 220) }),
+ testFieldMultiPointArray = new[] { new MultiPoint(new[] { new Point(20, 21), new Point(210, 220) }), new MultiPoint(new[] { new Point(120, 121), new Point(1210, 1220) }) },
+ testFieldPoint = new Point(555, 551),
+ testFieldPointArray = new[] { new Point(555, 551), new Point(53355, 3551) },
+ testFieldPolygon = new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ testFieldPolygonArray = new[]{
+ new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ new Polygon(new LinearRing(new[] { new Coordinate(50, 51), new Coordinate(500, 510), new Coordinate(800, 810), new Coordinate(50, 51) }))
+ },
+ testFieldMultiLineString = new MultiLineString(new[] { new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }), new LineString(new[] { new Coordinate(20, 21), new Coordinate(200, 210) }) }),
+ testFieldMultiLineStringArray = new[] {
+ new MultiLineString(new[] { new LineString(new[] { new Coordinate(10, 11), new Coordinate(100, 110) }), new LineString(new[] { new Coordinate(20, 21), new Coordinate(200, 210) }) }),
+ new MultiLineString(new[] { new LineString(new[] { new Coordinate(20, 21), new Coordinate(200, 220) }), new LineString(new[] { new Coordinate(820, 821), new Coordinate(800, 810) }) })
+ },
+ testFieldMultiPolygon = new MultiPolygon(new[]{
+ new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ new Polygon(new LinearRing(new[] { new Coordinate(50, 51), new Coordinate(500, 510), new Coordinate(800, 810), new Coordinate(50, 51) }))
+ }),
+ testFieldMultiPolygonArray = new[] {
+ new MultiPolygon(new[]{
+ new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ new Polygon(new LinearRing(new[] { new Coordinate(50, 51), new Coordinate(500, 510), new Coordinate(800, 810), new Coordinate(50, 51) }))
+ }),
+ new MultiPolygon(new[]{
+ new Polygon(new LinearRing(new[] { new Coordinate(10, 11), new Coordinate(100, 110), new Coordinate(300, 310), new Coordinate(10, 11) })),
+ new Polygon(new LinearRing(new[] { new Coordinate(50, 51), new Coordinate(500, 510), new Coordinate(800, 810), new Coordinate(50, 51) }))
+ })
+ },
+ testFieldSByte = sbyte.MaxValue,
+ testFieldSByteArray = new sbyte[] { 1, 2, 3, 4, 5 },
+ testFieldSByteArrayNullable = new sbyte?[] { 1, 2, 3, null, 4, 5 },
+ testFieldSByteNullable = sbyte.MinValue,
+ testFieldShort = short.MaxValue,
+ testFieldShortArray = new short[] { 1, 2, 3, 4, 5 },
+ testFieldShortArrayNullable = new short?[] { 1, 2, 3, null, 4, 5 },
+ testFieldShortNullable = short.MinValue,
+ testFieldString = "йstring'\\?!@#$%^&*()_+{}}{~?><<>",
+ testFieldStringArray = new[] { "йString1", "йString2", null, "йString3" },
+ testFieldTimeSpan = TimeSpan.FromDays(1),
+ testFieldTimeSpanArray = new[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(60) },
+ testFieldTimeSpanArrayNullable = new TimeSpan?[] { TimeSpan.FromDays(1), TimeSpan.FromSeconds(10), null, TimeSpan.FromSeconds(60) },
+ testFieldTimeSpanNullable = TimeSpan.FromSeconds(90),
+ testFieldTsrange = new NpgsqlRange(DateTime.Now, DateTime.Now.AddMonths(1)),
+ testFieldTsrangeArray = new[] { new NpgsqlRange(DateTime.Now, DateTime.Now.AddMonths(1)), new NpgsqlRange(DateTime.Now, DateTime.Now.AddMonths(2)) },
+ testFieldTsrangeArrayNullable = new NpgsqlRange?[] { new NpgsqlRange(DateTime.Now, DateTime.Now.AddMonths(1)), null, new NpgsqlRange(DateTime.Now, DateTime.Now.AddMonths(2)) },
+ testFieldTsrangeNullable = new NpgsqlRange(DateTime.Now, DateTime.Now.AddMonths(2)),
+ testFieldUInt = uint.MaxValue,
+ testFieldUIntArray = new uint[] { 1, 2, 3, 4, 5 },
+ testFieldUIntArrayNullable = new uint?[] { 1, 2, 3, null, 4, 5 },
+ testFieldUIntNullable = uint.MinValue,
+ testFieldULong = ulong.MaxValue,
+ testFieldULongArray = new ulong[] { 10, 20, 30, 40, 50 },
+ testFieldULongArrayNullable = new ulong?[] { 10, 20, 30, null, 40, 50 },
+ testFieldULongNullable = ulong.MinValue,
+ testFieldUShort = ushort.MaxValue,
+ testFieldUShortArray = new ushort[] { 11, 12, 13, 14, 15 },
+ testFieldUShortArrayNullable = new ushort?[] { 11, 12, 13, null, 14, 15 },
+ testFieldUShortNullable = ushort.MinValue,
+ testFielLongArrayNullable = new long?[] { 500, 600, 700, null, 999, 1000 },
+ testFielLongNullable = long.MinValue
+ };
+
+ var sqlPar = insert.AppendData(item2).ToSql();
+ var sqlText = insert.AppendData(item2).NoneParameter().ToSql();
+ var item3NP = insert.AppendData(item2).NoneParameter().ExecuteInserted();
+
+ var item3 = insert.AppendData(item2).ExecuteInserted().First();
+ var newitem2 = select.Where(a => a.Id == item3.Id && object.Equals(a.testFieldJToken["a"], "1")).ToOne();
+ Assert.Equal(item2.testFieldString, newitem2.testFieldString);
+
+ item3 = insert.NoneParameter().AppendData(item2).ExecuteInserted().First();
+ newitem2 = select.Where(a => a.Id == item3.Id && object.Equals(a.testFieldJToken["a"], "1")).ToOne();
+ Assert.Equal(item2.testFieldString, newitem2.testFieldString);
+
+ var items = select.ToList();
+ }
+
+ [Table(Name = "tb_alltype_nts")]
+ class TableAllType
+ {
+ [Column(IsIdentity = true, IsPrimary = true)]
+ public int Id { get; set; }
+
+ public bool testFieldBool { get; set; }
+ public sbyte testFieldSByte { get; set; }
+ public short testFieldShort { get; set; }
+ public int testFieldInt { get; set; }
+ public long testFieldLong { get; set; }
+ public byte testFieldByte { get; set; }
+ public ushort testFieldUShort { get; set; }
+ public uint testFieldUInt { get; set; }
+ public ulong testFieldULong { get; set; }
+ public double testFieldDouble { get; set; }
+ public float testFieldFloat { get; set; }
+ public decimal testFieldDecimal { get; set; }
+ public TimeSpan testFieldTimeSpan { get; set; }
+
+ [Column(ServerTime = DateTimeKind.Local)]
+ public DateTime testFieldDateTime { get; set; }
+
+ public byte[] testFieldBytes { get; set; }
+ public string testFieldString { get; set; }
+ public Guid testFieldGuid { get; set; }
+ public NpgsqlPoint testFieldNpgsqlPoint { get; set; }
+ public NpgsqlLine testFieldNpgsqlLine { get; set; }
+ public NpgsqlLSeg testFieldNpgsqlLSeg { get; set; }
+ public NpgsqlBox testFieldNpgsqlBox { get; set; }
+ public NpgsqlPath testFieldNpgsqlPath { get; set; }
+ public NpgsqlPolygon testFieldNpgsqlPolygon { get; set; }
+ public NpgsqlCircle testFieldNpgsqlCircle { get; set; }
+ public (IPAddress Address, int Subnet) testFieldCidr { get; set; }
+ public NpgsqlRange testFieldInt4range { get; set; }
+ public NpgsqlRange testFieldInt8range { get; set; }
+ public NpgsqlRange testFieldNumrange { get; set; }
+ public NpgsqlRange testFieldTsrange { get; set; }
+
+ public bool? testFieldBoolNullable { get; set; }
+ public sbyte? testFieldSByteNullable { get; set; }
+ public short? testFieldShortNullable { get; set; }
+ public int? testFieldIntNullable { get; set; }
+ public long? testFielLongNullable { get; set; }
+ public byte? testFieldByteNullable { get; set; }
+ public ushort? testFieldUShortNullable { get; set; }
+ public uint? testFieldUIntNullable { get; set; }
+ public ulong? testFieldULongNullable { get; set; }
+ public double? testFieldDoubleNullable { get; set; }
+ public float? testFieldFloatNullable { get; set; }
+ public decimal? testFieldDecimalNullable { get; set; }
+ public TimeSpan? testFieldTimeSpanNullable { get; set; }
+
+ [Column(ServerTime = DateTimeKind.Local)]
+ public DateTime? testFieldDateTimeNullable { get; set; }
+
+ public Guid? testFieldGuidNullable { get; set; }
+ public NpgsqlPoint? testFieldNpgsqlPointNullable { get; set; }
+ public NpgsqlLine? testFieldNpgsqlLineNullable { get; set; }
+ public NpgsqlLSeg? testFieldNpgsqlLSegNullable { get; set; }
+ public NpgsqlBox? testFieldNpgsqlBoxNullable { get; set; }
+ public NpgsqlPath? testFieldNpgsqlPathNullable { get; set; }
+ public NpgsqlPolygon? testFieldNpgsqlPolygonNullable { get; set; }
+ public NpgsqlCircle? testFieldNpgsqlCircleNullable { get; set; }
+ public (IPAddress Address, int Subnet)? testFieldCidrNullable { get; set; }
+ public NpgsqlRange? testFieldInt4rangeNullable { get; set; }
+ public NpgsqlRange? testFieldInt8rangeNullable { get; set; }
+ public NpgsqlRange? testFieldNumrangeNullable { get; set; }
+ public NpgsqlRange? testFieldTsrangeNullable { get; set; }
+
+ public BitArray testFieldBitArray { get; set; }
+ public IPAddress testFieldInet { get; set; }
+ public PhysicalAddress testFieldMacaddr { get; set; }
+ public JToken testFieldJToken { get; set; }
+ public JObject testFieldJObject { get; set; }
+ public JArray testFieldJArray { get; set; }
+ public Dictionary testFieldHStore { get; set; }
+ public Point testFieldPoint { get; set; }
+ public LineString testFieldLineString { get; set; }
+ public Polygon testFieldPolygon { get; set; }
+ public MultiPoint testFieldMultiPoint { get; set; }
+ public MultiLineString testFieldMultiLineString { get; set; }
+ public MultiPolygon testFieldMultiPolygon { get; set; }
+ public Geometry testFieldGeometry { get; set; }
+ public GeometryCollection testFieldGeometryCollection { get; set; }
+
+ public TableAllTypeEnumType1 testFieldEnum1 { get; set; }
+ public TableAllTypeEnumType1? testFieldEnum1Nullable { get; set; }
+ public TableAllTypeEnumType2 testFieldEnum2 { get; set; }
+ public TableAllTypeEnumType2? testFieldEnum2Nullable { get; set; }
+
+ /* array */
+ public bool[] testFieldBoolArray { get; set; }
+ public sbyte[] testFieldSByteArray { get; set; }
+ public short[] testFieldShortArray { get; set; }
+ public int[] testFieldIntArray { get; set; }
+ public long[] testFieldLongArray { get; set; }
+ public byte[] testFieldByteArray { get; set; }
+ public ushort[] testFieldUShortArray { get; set; }
+ public uint[] testFieldUIntArray { get; set; }
+ public ulong[] testFieldULongArray { get; set; }
+ public double[] testFieldDoubleArray { get; set; }
+ public float[] testFieldFloatArray { get; set; }
+ public decimal[] testFieldDecimalArray { get; set; }
+ public TimeSpan[] testFieldTimeSpanArray { get; set; }
+ public DateTime[] testFieldDateTimeArray { get; set; }
+ public byte[][] testFieldBytesArray { get; set; }
+ public string[] testFieldStringArray { get; set; }
+ public Guid[] testFieldGuidArray { get; set; }
+ public NpgsqlPoint[] testFieldNpgsqlPointArray { get; set; }
+ public NpgsqlLine[] testFieldNpgsqlLineArray { get; set; }
+ public NpgsqlLSeg[] testFieldNpgsqlLSegArray { get; set; }
+ public NpgsqlBox[] testFieldNpgsqlBoxArray { get; set; }
+ public NpgsqlPath[] testFieldNpgsqlPathArray { get; set; }
+ public NpgsqlPolygon[] testFieldNpgsqlPolygonArray { get; set; }
+ public NpgsqlCircle[] testFieldNpgsqlCircleArray { get; set; }
+ public (IPAddress Address, int Subnet)[] testFieldCidrArray { get; set; }
+ public NpgsqlRange[] testFieldInt4rangeArray { get; set; }
+ public NpgsqlRange[] testFieldInt8rangeArray { get; set; }
+ public NpgsqlRange[] testFieldNumrangeArray { get; set; }
+ public NpgsqlRange[] testFieldTsrangeArray { get; set; }
+
+ public bool?[] testFieldBoolArrayNullable { get; set; }
+ public sbyte?[] testFieldSByteArrayNullable { get; set; }
+ public short?[] testFieldShortArrayNullable { get; set; }
+ public int?[] testFieldIntArrayNullable { get; set; }
+ public long?[] testFielLongArrayNullable { get; set; }
+ public byte?[] testFieldByteArrayNullable { get; set; }
+ public ushort?[] testFieldUShortArrayNullable { get; set; }
+ public uint?[] testFieldUIntArrayNullable { get; set; }
+ public ulong?[] testFieldULongArrayNullable { get; set; }
+ public double?[] testFieldDoubleArrayNullable { get; set; }
+ public float?[] testFieldFloatArrayNullable { get; set; }
+ public decimal?[] testFieldDecimalArrayNullable { get; set; }
+ public TimeSpan?[] testFieldTimeSpanArrayNullable { get; set; }
+ public DateTime?[] testFieldDateTimeArrayNullable { get; set; }
+ public Guid?[] testFieldGuidArrayNullable { get; set; }
+ public NpgsqlPoint?[] testFieldNpgsqlPointArrayNullable { get; set; }
+ public NpgsqlLine?[] testFieldNpgsqlLineArrayNullable { get; set; }
+ public NpgsqlLSeg?[] testFieldNpgsqlLSegArrayNullable { get; set; }
+ public NpgsqlBox?[] testFieldNpgsqlBoxArrayNullable { get; set; }
+ public NpgsqlPath?[] testFieldNpgsqlPathArrayNullable { get; set; }
+ public NpgsqlPolygon?[] testFieldNpgsqlPolygonArrayNullable { get; set; }
+ public NpgsqlCircle?[] testFieldNpgsqlCircleArrayNullable { get; set; }
+ public (IPAddress Address, int Subnet)?[] testFieldCidrArrayNullable { get; set; }
+ public NpgsqlRange?[] testFieldInt4rangeArrayNullable { get; set; }
+ public NpgsqlRange?[] testFieldInt8rangeArrayNullable { get; set; }
+ public NpgsqlRange?[] testFieldNumrangeArrayNullable { get; set; }
+ public NpgsqlRange?[] testFieldTsrangeArrayNullable { get; set; }
+
+ public BitArray[] testFieldBitArrayArray { get; set; }
+ public IPAddress[] testFieldInetArray { get; set; }
+ public PhysicalAddress[] testFieldMacaddrArray { get; set; }
+ public JToken[] testFieldJTokenArray { get; set; }
+ public JObject[] testFieldJObjectArray { get; set; }
+ public JArray[] testFieldJArrayArray { get; set; }
+ public Dictionary[] testFieldHStoreArray { get; set; }
+ public Point[] testFieldPointArray { get; set; }
+ public LineString[] testFieldLineStringArray { get; set; }
+ public Polygon[] testFieldPolygonArray { get; set; }
+ public MultiPoint[] testFieldMultiPointArray { get; set; }
+ public MultiLineString[] testFieldMultiLineStringArray { get; set; }
+ public MultiPolygon[] testFieldMultiPolygonArray { get; set; }
+ public Geometry[] testFieldGeometryArray { get; set; }
+ public GeometryCollection[] testFieldGeometryCollectionArray { get; set; }
+
+ public TableAllTypeEnumType1[] testFieldEnum1Array { get; set; }
+ public TableAllTypeEnumType1?[] testFieldEnum1ArrayNullable { get; set; }
+ public TableAllTypeEnumType2[] testFieldEnum2Array { get; set; }
+ public TableAllTypeEnumType2?[] testFieldEnum2ArrayNullable { get; set; }
+ }
+
+ public enum TableAllTypeEnumType1 { e1, e2, e3, e5 }
+ [Flags] public enum TableAllTypeEnumType2 { f1, f2, f3 }
+ }
+}
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/g.cs b/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/g.cs
new file mode 100644
index 00000000..6af8b546
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite/g.cs
@@ -0,0 +1,27 @@
+using Npgsql;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Text;
+using System.Threading;
+
+public class g
+{
+ static Lazy pgsqlLazy = new Lazy(() =>
+ {
+ NpgsqlConnection.GlobalTypeMapper.UseNetTopologySuite();
+ return new FreeSql.FreeSqlBuilder()
+ .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2")
+ //.UseConnectionFactory(FreeSql.DataType.PostgreSQL, () => new Npgsql.NpgsqlConnection("Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;"))
+ .UseAutoSyncStructure(true)
+ //.UseGenerateCommandParameterWithLambda(true)
+ .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower)
+ .UseLazyLoading(true)
+ .UseMonitorCommand(
+ cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText) //监听SQL命令对象,在执行前
+ //, (cmd, traceLog) => Console.WriteLine(traceLog)
+ )
+ .Build();
+ });
+ public static IFreeSql pgsql => pgsqlLazy.Value;
+}
diff --git a/FreeSql.sln b/FreeSql.sln
index c27f7820..c84703c1 100644
--- a/FreeSql.sln
+++ b/FreeSql.sln
@@ -82,6 +82,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "aspnetcore_transaction", "E
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.ShenTong", "Providers\FreeSql.Provider.ShenTong\FreeSql.Provider.ShenTong.csproj", "{938173AF-157F-4040-AED3-171DA1809CAA}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite", "FreeSql.Tests\FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite\FreeSql.Tests.Provider.PostgreSQL.NetTopologySuite.csproj", "{330F15A7-5089-456B-B553-A98B14DEB764}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -500,6 +502,18 @@ Global
{938173AF-157F-4040-AED3-171DA1809CAA}.Release|x64.Build.0 = Release|Any CPU
{938173AF-157F-4040-AED3-171DA1809CAA}.Release|x86.ActiveCfg = Release|Any CPU
{938173AF-157F-4040-AED3-171DA1809CAA}.Release|x86.Build.0 = Release|Any CPU
+ {330F15A7-5089-456B-B553-A98B14DEB764}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {330F15A7-5089-456B-B553-A98B14DEB764}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {330F15A7-5089-456B-B553-A98B14DEB764}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {330F15A7-5089-456B-B553-A98B14DEB764}.Debug|x64.Build.0 = Debug|Any CPU
+ {330F15A7-5089-456B-B553-A98B14DEB764}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {330F15A7-5089-456B-B553-A98B14DEB764}.Debug|x86.Build.0 = Debug|Any CPU
+ {330F15A7-5089-456B-B553-A98B14DEB764}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {330F15A7-5089-456B-B553-A98B14DEB764}.Release|Any CPU.Build.0 = Release|Any CPU
+ {330F15A7-5089-456B-B553-A98B14DEB764}.Release|x64.ActiveCfg = Release|Any CPU
+ {330F15A7-5089-456B-B553-A98B14DEB764}.Release|x64.Build.0 = Release|Any CPU
+ {330F15A7-5089-456B-B553-A98B14DEB764}.Release|x86.ActiveCfg = Release|Any CPU
+ {330F15A7-5089-456B-B553-A98B14DEB764}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs
index 78bf79be..952770d6 100644
--- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs
+++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs
@@ -372,12 +372,7 @@ namespace FreeSql.Internal.CommonProvider
if (whereExp == null)
{
tbref = tb.GetTableRef(collMem.Member.Name, true);
- if (tbref == null)
- {
- tb = _commonUtils.GetTableByEntity(collMem.Expression.Type); //debug https://github.com/dotnetcore/FreeSql/issues/367
- tbref = tb.GetTableRef(collMem.Member.Name, true);
- if (tbref == null) throw new Exception($"IncludeMany 类型 {tb.Type.DisplayCsharp()} 的属性 {collMem.Member.Name} 不是有效的导航属性,提示:IsIgnore = true 不会成为导航属性");
- }
+ if (tbref == null) throw new Exception($"IncludeMany 类型 {tb.Type.DisplayCsharp()} 的属性 {collMem.Member.Name} 不是有效的导航属性,提示:IsIgnore = true 不会成为导航属性");
}
else
{
diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj
index 84ba2ae4..5ac3581a 100644
--- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj
+++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj
@@ -31,6 +31,7 @@
+
@@ -41,6 +42,10 @@
net45
+
+ nts
+
+
diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs
index e62d578d..c7834ba8 100644
--- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs
+++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs
@@ -70,6 +70,7 @@ namespace FreeSql.PostgreSQL
{ typeof(NpgsqlRange).FullName, CsToDb.New(NpgsqlDbType.Range | NpgsqlDbType.Timestamp, "tsrange", "tsrange NOT NULL", false, false, NpgsqlRange.Empty) },{ typeof(NpgsqlRange?).FullName, CsToDb.New(NpgsqlDbType.Range | NpgsqlDbType.Timestamp, "tsrange", "tsrange", false, true, null) },
{ typeof(Dictionary).FullName, CsToDb.New(NpgsqlDbType.Hstore, "hstore", "hstore", false, null, new Dictionary()) },
+
{ typeof(PostgisPoint).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new PostgisPoint(0, 0)) },
{ typeof(PostgisLineString).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new PostgisLineString(new []{new Coordinate2D(0, 0),new Coordinate2D(0, 0) })) },
{ typeof(PostgisPolygon).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new PostgisPolygon(new []{new []{new Coordinate2D(0, 0),new Coordinate2D(0, 0) }, new []{new Coordinate2D(0, 0),new Coordinate2D(0, 0) } })) },
@@ -78,7 +79,18 @@ namespace FreeSql.PostgreSQL
{ typeof(PostgisMultiPolygon).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new PostgisMultiPolygon(new[]{new PostgisPolygon(new []{new []{new Coordinate2D(0, 0),new Coordinate2D(0, 0) }, new []{new Coordinate2D(0, 0),new Coordinate2D(0, 0) } }),new PostgisPolygon(new []{new []{new Coordinate2D(0, 0),new Coordinate2D(0, 0) }, new []{new Coordinate2D(0, 0),new Coordinate2D(0, 0) } }) })) },
{ typeof(PostgisGeometry).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new PostgisPoint(0, 0)) },
{ typeof(PostgisGeometryCollection).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new PostgisGeometryCollection(new[]{new PostgisPoint(0, 0),new PostgisPoint(0, 0) })) },
- };
+
+#if nts
+ { typeof(NetTopologySuite.Geometries.Point).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new NetTopologySuite.Geometries.Point(0, 0)) },
+ { typeof(NetTopologySuite.Geometries.LineString).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new NetTopologySuite.Geometries.LineString(new []{new NetTopologySuite.Geometries.Coordinate(0, 0),new NetTopologySuite.Geometries.Coordinate(0, 0) })) },
+ { typeof(NetTopologySuite.Geometries.Polygon).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new NetTopologySuite.Geometries.Polygon(new NetTopologySuite.Geometries.LinearRing(new []{ new NetTopologySuite.Geometries.Coordinate(0, 0),new NetTopologySuite.Geometries.Coordinate(0, 0), new NetTopologySuite.Geometries.Coordinate(0, 0),new NetTopologySuite.Geometries.Coordinate(0, 0) }))) },
+ { typeof(NetTopologySuite.Geometries.MultiPoint).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new NetTopologySuite.Geometries.MultiPoint(new []{new NetTopologySuite.Geometries.Point(0, 0),new NetTopologySuite.Geometries.Point(0, 0) })) },
+ { typeof(NetTopologySuite.Geometries.MultiLineString).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new NetTopologySuite.Geometries.MultiLineString(new[]{new NetTopologySuite.Geometries.LineString(new []{new NetTopologySuite.Geometries.Coordinate(0, 0),new NetTopologySuite.Geometries.Coordinate(0, 0) }),new NetTopologySuite.Geometries.LineString(new []{new NetTopologySuite.Geometries.Coordinate(0, 0),new NetTopologySuite.Geometries.Coordinate(0, 0) }) })) },
+ { typeof(NetTopologySuite.Geometries.MultiPolygon).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new NetTopologySuite.Geometries.MultiPolygon(new[]{new NetTopologySuite.Geometries.Polygon(new NetTopologySuite.Geometries.LinearRing(new []{ new NetTopologySuite.Geometries.Coordinate(0, 0),new NetTopologySuite.Geometries.Coordinate(0, 0), new NetTopologySuite.Geometries.Coordinate(0, 0),new NetTopologySuite.Geometries.Coordinate(0, 0) })), new NetTopologySuite.Geometries.Polygon(new NetTopologySuite.Geometries.LinearRing(new []{ new NetTopologySuite.Geometries.Coordinate(0, 0),new NetTopologySuite.Geometries.Coordinate(0, 0), new NetTopologySuite.Geometries.Coordinate(0, 0),new NetTopologySuite.Geometries.Coordinate(0, 0) })) })) },
+ { typeof(NetTopologySuite.Geometries.Geometry).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new NetTopologySuite.Geometries.Point(0, 0)) },
+ { typeof(NetTopologySuite.Geometries.GeometryCollection).FullName, CsToDb.New(NpgsqlDbType.Geometry, "geometry", "geometry", false, null, new NetTopologySuite.Geometries.GeometryCollection(new[]{new NetTopologySuite.Geometries.Point(0, 0),new NetTopologySuite.Geometries.Point(0, 0) })) },
+#endif
+ };
public override DbInfoResult GetDbInfo(Type type)
{
diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs
index 839b9421..63f00d91 100644
--- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs
+++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs
@@ -37,6 +37,7 @@ namespace FreeSql.PostgreSQL
Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true;
Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true;
Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true;
+
Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisPoint)] = true;
Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisLineString)] = true;
Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisPolygon)] = true;
@@ -45,6 +46,18 @@ namespace FreeSql.PostgreSQL
Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiPolygon)] = true;
Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisGeometry)] = true;
Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisGeometryCollection)] = true;
+
+#if nts
+ Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.Point)] = true;
+ Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.LineString)] = true;
+ Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.Polygon)] = true;
+ Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.MultiPoint)] = true;
+ Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.MultiLineString)] = true;
+ Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.MultiPolygon)] = true;
+ Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.Geometry)] = true;
+ Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.GeometryCollection)] = true;
+#endif
+
Utils.dicExecuteArrayRowReadClassOrTuple[typeof(Dictionary)] = true;
Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JToken)] = true;
Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JObject)] = true;
@@ -61,6 +74,7 @@ namespace FreeSql.PostgreSQL
case "Newtonsoft.Json.Linq.JObject": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJObjectParse, Expression.Convert(valueExp, typeof(string))), typeof(JObject)));
case "Newtonsoft.Json.Linq.JArray": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJArrayParse, Expression.Convert(valueExp, typeof(string))), typeof(JArray)));
case "Npgsql.LegacyPostgis.PostgisGeometry": return Expression.Return(returnTarget, valueExp);
+ case "NetTopologySuite.Geometries.Geometry": return Expression.Return(returnTarget, valueExp);
}
return null;
});
diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs
index cf1b6baf..ed6cb447 100644
--- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs
+++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs
@@ -44,19 +44,28 @@ namespace FreeSql.PostgreSQL
{ typeof(ushort).FullName, a => int.Parse(string.Concat(a)) }, { typeof(ushort[]).FullName, a => getParamterArrayValue(typeof(int), a, 0) }, { typeof(ushort?[]).FullName, a => getParamterArrayValue(typeof(int?), a, null) },
{ typeof(byte).FullName, a => short.Parse(string.Concat(a)) }, { typeof(byte[]).FullName, a => getParamterArrayValue(typeof(short), a, 0) }, { typeof(byte?[]).FullName, a => getParamterArrayValue(typeof(short?), a, null) },
{ typeof(sbyte).FullName, a => short.Parse(string.Concat(a)) }, { typeof(sbyte[]).FullName, a => getParamterArrayValue(typeof(short), a, 0) }, { typeof(sbyte?[]).FullName, a => getParamterArrayValue(typeof(short?), a, null) },
+
{ typeof(NpgsqlPath).FullName, a => {
var path = (NpgsqlPath)a;
try { int count = path.Count; return path; } catch { return new NpgsqlPath(new NpgsqlPoint(0, 0)); }
- } }, { typeof(NpgsqlPath[]).FullName, a => getParamterArrayValue(typeof(NpgsqlPath), a, new NpgsqlPath(new NpgsqlPoint(0, 0))) }, { typeof(NpgsqlPath?[]).FullName, a => getParamterArrayValue(typeof(NpgsqlPath?), a, null) },
+ } },
+ { typeof(NpgsqlPath[]).FullName, a => getParamterArrayValue(typeof(NpgsqlPath), a, new NpgsqlPath(new NpgsqlPoint(0, 0))) },
+ { typeof(NpgsqlPath?[]).FullName, a => getParamterArrayValue(typeof(NpgsqlPath?), a, null) },
+
{ typeof(NpgsqlPolygon).FullName, a => {
var polygon = (NpgsqlPolygon)a;
try { int count = polygon.Count; return polygon; } catch { return new NpgsqlPolygon(new NpgsqlPoint(0, 0), new NpgsqlPoint(0, 0)); }
- } }, { typeof(NpgsqlPolygon[]).FullName, a => getParamterArrayValue(typeof(NpgsqlPolygon), a, new NpgsqlPolygon(new NpgsqlPoint(0, 0), new NpgsqlPoint(0, 0))) }, { typeof(NpgsqlPolygon?[]).FullName, a => getParamterArrayValue(typeof(NpgsqlPolygon?), a, null) },
+ } },
+ { typeof(NpgsqlPolygon[]).FullName, a => getParamterArrayValue(typeof(NpgsqlPolygon), a, new NpgsqlPolygon(new NpgsqlPoint(0, 0), new NpgsqlPoint(0, 0))) },
+ { typeof(NpgsqlPolygon?[]).FullName, a => getParamterArrayValue(typeof(NpgsqlPolygon?), a, null) },
+
{ typeof((IPAddress Address, int Subnet)).FullName, a => {
var inet = ((IPAddress Address, int Subnet))a;
if (inet.Address == null) return (IPAddress.Any, inet.Subnet);
return inet;
- } }, { typeof((IPAddress Address, int Subnet)[]).FullName, a => getParamterArrayValue(typeof((IPAddress Address, int Subnet)), a, (IPAddress.Any, 0)) }, { typeof((IPAddress Address, int Subnet)?[]).FullName, a => getParamterArrayValue(typeof((IPAddress Address, int Subnet)?), a, null) },
+ } },
+ { typeof((IPAddress Address, int Subnet)[]).FullName, a => getParamterArrayValue(typeof((IPAddress Address, int Subnet)), a, (IPAddress.Any, 0)) },
+ { typeof((IPAddress Address, int Subnet)?[]).FullName, a => getParamterArrayValue(typeof((IPAddress Address, int Subnet)?), a, null) },
};
static object getParamterValue(Type type, object value, int level = 0)
{
@@ -156,7 +165,16 @@ namespace FreeSql.PostgreSQL
{
if (value == null) return "NULL";
if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value);
- if (_dicIsAssignableFromPostgisGeometry.GetOrAdd(type, t2 => typeof(PostgisGeometry).IsAssignableFrom(type.IsArray ? type.GetElementType() : type)))
+ if (_dicIsAssignableFromPostgisGeometry.GetOrAdd(type, t2 =>
+ {
+ var t2type = t2.IsArray ? t2.GetElementType() : t2;
+ return typeof(PostgisGeometry).IsAssignableFrom(t2type)
+ #if nts
+ ||
+ typeof(NetTopologySuite.Geometries.Geometry).IsAssignableFrom(t2type)
+ #endif
+ ;
+ }))
{
var pam = AppendParamter(specialParams, null, null, type, value);
return pam.ParameterName;