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;