From 5b2ff93ecd3c8baf33402e8d69d51bbe8389c7f6 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 14 Aug 2024 21:53:50 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E6=B5=8B=E8=AF=95=20KingbaseES=20=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E7=AD=89=E7=89=B9=E6=AE=8A=E7=B1=BB=E5=9E=8B=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../KingbaseES/KingbaseESCodeFirstTest.cs | 656 +++++--- FreeSql.Tests/FreeSql.Tests/g.cs | 2 +- FreeSql/FreeSql.xml | 1432 ++++++++--------- .../PostgreSQL/CustomPostgreSQLCodeFirst.cs | 9 +- .../PostgreSQL/CustomPostgreSQLDbFirst.cs | 4 + .../KingbaseESCodeFirst.cs | 8 +- .../KingbaseESDbFirst.cs | 25 +- .../PostgreSQL/OdbcPostgreSQLCodeFirst.cs | 9 +- .../PostgreSQL/OdbcPostgreSQLDbFirst.cs | 5 + .../PostgreSQLCodeFirst.cs | 9 +- .../PostgreSQLDbFirst.cs | 4 + 11 files changed, 1179 insertions(+), 984 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/KingbaseES/KingbaseESCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/KingbaseES/KingbaseESCodeFirstTest.cs index 891e89f6..08488b33 100644 --- a/FreeSql.Tests/FreeSql.Tests/KingbaseES/KingbaseESCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/KingbaseES/KingbaseESCodeFirstTest.cs @@ -1,8 +1,14 @@ -using FreeSql.DataAnnotations; +锘縰sing FreeSql.DataAnnotations; +using KdbndpTypes; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; 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; @@ -10,12 +16,33 @@ namespace FreeSql.Tests.KingbaseES { public class KingbaseESCodeFirstTest { + + [Fact] + public void Test_0String() + { + var fsql = g.kingbaseES; + fsql.Delete().Where("1=1").ExecuteAffrows(); + + Assert.Equal(1, fsql.Insert(new test_0string01 { name = @"1.0000\0.0000\0.0000\0.0000\1.0000\0.0000" }).ExecuteAffrows()); + Assert.Equal(1, fsql.Insert(new test_0string01 { name = @"1.0000\0.0000\0.0000\0.0000\1.0000\0.0000" }).NoneParameter().ExecuteAffrows()); + + var list = fsql.Select().ToList(); + Assert.Equal(2, list.Count); + Assert.Equal(@"1.0000\0.0000\0.0000\0.0000\1.0000\0.0000", list[0].name); + Assert.Equal(@"1.0000\0.0000\0.0000\0.0000\1.0000\0.0000", list[1].name); + } + class test_0string01 + { + public Guid id { get; set; } + public string name { get; set; } + } + [Fact] public void InsertUpdateParameter() { var fsql = g.kingbaseES; fsql.CodeFirst.SyncStructure(); - var item = new ts_iupstr { id = Guid.NewGuid(), title = string.Join(",", Enumerable.Range(0, 2000).Select(a => "我是中国人")) }; + var item = new ts_iupstr { id = Guid.NewGuid(), title = string.Join(",", Enumerable.Range(0, 2000).Select(a => "鎴戞槸涓浗浜")) }; Assert.Equal(1, fsql.Insert(item).ExecuteAffrows()); var find = fsql.Select().Where(a => a.id == item.id).First(); Assert.NotNull(find); @@ -35,6 +62,83 @@ namespace FreeSql.Tests.KingbaseES public string title { get; set; } } + [Fact] + public void DateTime_1() + { + var item1 = new TS_DATETIME01 { CreateTime = DateTime.Now }; + Assert.Equal(1, g.kingbaseES.Insert(item1).ExecuteAffrows()); + + var item2 = g.kingbaseES.Select().Where(a => a.Id == item1.Id).First(); + Assert.NotNull(item2.CreateTime); + Assert.True(1 > Math.Abs(item2.CreateTime.Value.Subtract(item1.CreateTime.Value).TotalSeconds)); + + item1.CreateTime = DateTime.Now; + Assert.Equal(1, g.kingbaseES.Update().SetSource(item1).ExecuteAffrows()); + item2 = g.kingbaseES.Select().Where(a => a.Id == item1.Id).First(); + Assert.NotNull(item2.CreateTime); + Assert.True(1 > Math.Abs(item2.CreateTime.Value.Subtract(item1.CreateTime.Value).TotalSeconds)); + } + class TS_DATETIME01 + { + public Guid Id { get; set; } + [Column(DbType = "timestamp NULL")] + public DateTime? CreateTime { get; set; } + } + [Fact] + public void DateTime_2() + { + var item1 = new TS_DATETIME02 { CreateTime = DateTime.Now }; + Assert.Equal(1, g.kingbaseES.Insert(item1).ExecuteAffrows()); + + var item2 = g.kingbaseES.Select().Where(a => a.Id == item1.Id).First(); + Assert.NotNull(item2.CreateTime); + Assert.True(1 > Math.Abs(item2.CreateTime.Value.Subtract(item1.CreateTime.Value).TotalSeconds)); + + item1.CreateTime = DateTime.Now; + Assert.Equal(1, g.kingbaseES.Update().SetSource(item1).ExecuteAffrows()); + item2 = g.kingbaseES.Select().Where(a => a.Id == item1.Id).First(); + Assert.NotNull(item2.CreateTime); + Assert.True(1 > Math.Abs(item2.CreateTime.Value.Subtract(item1.CreateTime.Value).TotalSeconds)); + } + class TS_DATETIME02 + { + public Guid Id { get; set; } + [Column(DbType = "timestamp NOT NULL")] + public DateTime? CreateTime { get; set; } + } + + [Fact] + public void Blob() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "鎴戞槸涓浗浜")); + var data1 = Encoding.UTF8.GetBytes(str1); + + var item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.kingbaseES.Insert(item1).ExecuteAffrows()); + + var item2 = g.kingbaseES.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + var str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + + //NoneParameter + item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.kingbaseES.Insert().NoneParameter().AppendData(item1).ExecuteAffrows()); + + item2 = g.kingbaseES.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + } + class TS_BLB01 + { + public Guid Id { get; set; } + [MaxLength(-1)] + public byte[] Data { get; set; } + } + [Fact] public void StringLength() { @@ -52,106 +156,57 @@ namespace FreeSql.Tests.KingbaseES } [Fact] - public void 数字表_字段() + public void 涓枃琛╛瀛楁() { - var sql = g.kingbaseES.CodeFirst.GetComparisonDDLStatements<测试数字表>(); - g.kingbaseES.CodeFirst.SyncStructure<测试数字表>(); + var sql = g.kingbaseES.CodeFirst.GetComparisonDDLStatements<娴嬭瘯涓枃琛>(); + g.kingbaseES.CodeFirst.SyncStructure<娴嬭瘯涓枃琛>(); - var item = new 测试数字表 + var item = new 娴嬭瘯涓枃琛 { - 标题 = "测试标题", - 创建时间 = DateTime.Now + 鏍囬 = "娴嬭瘯鏍囬", + 鍒涘缓鏃堕棿 = DateTime.Now }; - Assert.Equal(1, g.kingbaseES.Insert<测试数字表>().AppendData(item).ExecuteAffrows()); - Assert.NotEqual(Guid.Empty, item.编号); - var item2 = g.kingbaseES.Select<测试数字表>().Where(a => a.编号 == item.编号).First(); + Assert.Equal(1, g.kingbaseES.Insert<娴嬭瘯涓枃琛>().AppendData(item).ExecuteAffrows()); + Assert.NotEqual(Guid.Empty, item.缂栧彿); + var item2 = g.kingbaseES.Select<娴嬭瘯涓枃琛>().Where(a => a.缂栧彿 == item.缂栧彿).First(); Assert.NotNull(item2); - Assert.Equal(item.编号, item2.编号); - Assert.Equal(item.标题, item2.标题); + Assert.Equal(item.缂栧彿, item2.缂栧彿); + Assert.Equal(item.鏍囬, item2.鏍囬); - item.标题 = "测试标题更新"; - Assert.Equal(1, g.kingbaseES.Update<测试数字表>().SetSource(item).ExecuteAffrows()); - item2 = g.kingbaseES.Select<测试数字表>().Where(a => a.编号 == item.编号).First(); + item.鏍囬 = "娴嬭瘯鏍囬鏇存柊"; + Assert.Equal(1, g.kingbaseES.Update<娴嬭瘯涓枃琛>().SetSource(item).ExecuteAffrows()); + item2 = g.kingbaseES.Select<娴嬭瘯涓枃琛>().Where(a => a.缂栧彿 == item.缂栧彿).First(); Assert.NotNull(item2); - Assert.Equal(item.编号, item2.编号); - Assert.Equal(item.标题, item2.标题); + Assert.Equal(item.缂栧彿, item2.缂栧彿); + Assert.Equal(item.鏍囬, item2.鏍囬); - item.标题 = "测试标题更新_repo"; - var repo = g.kingbaseES.GetRepository<测试数字表>(); + item.鏍囬 = "娴嬭瘯鏍囬鏇存柊_repo"; + var repo = g.kingbaseES.GetRepository<娴嬭瘯涓枃琛>(); Assert.Equal(1, repo.Update(item)); - item2 = g.kingbaseES.Select<测试数字表>().Where(a => a.编号 == item.编号).First(); + item2 = g.kingbaseES.Select<娴嬭瘯涓枃琛>().Where(a => a.缂栧彿 == item.缂栧彿).First(); Assert.NotNull(item2); - Assert.Equal(item.编号, item2.编号); - Assert.Equal(item.标题, item2.标题); + Assert.Equal(item.缂栧彿, item2.缂栧彿); + Assert.Equal(item.鏍囬, item2.鏍囬); - item.标题 = "测试标题更新_repo22"; + item.鏍囬 = "娴嬭瘯鏍囬鏇存柊_repo22"; Assert.Equal(1, repo.Update(item)); - item2 = g.kingbaseES.Select<测试数字表>().Where(a => a.编号 == item.编号).First(); + item2 = g.kingbaseES.Select<娴嬭瘯涓枃琛>().Where(a => a.缂栧彿 == item.缂栧彿).First(); Assert.NotNull(item2); - Assert.Equal(item.编号, item2.编号); - Assert.Equal(item.标题, item2.标题); + Assert.Equal(item.缂栧彿, item2.缂栧彿); + Assert.Equal(item.鏍囬, item2.鏍囬); } - [Table(Name = "123测试数字表")] - class 测试数字表 - { - [Column(IsPrimary = true, Name = "123编号")] - public Guid 编号 { get; set; } - - [Column(Name = "123标题")] - public string 标题 { get; set; } - - [Column(Name = "123创建时间")] - public DateTime 创建时间 { get; set; } - } - - [Fact] - public void 中文表_字段() - { - var sql = g.kingbaseES.CodeFirst.GetComparisonDDLStatements<测试中文表>(); - g.kingbaseES.CodeFirst.SyncStructure<测试中文表>(); - - var item = new 测试中文表 - { - 标题 = "测试标题", - 创建时间 = DateTime.Now - }; - Assert.Equal(1, g.kingbaseES.Insert<测试中文表>().AppendData(item).ExecuteAffrows()); - Assert.NotEqual(Guid.Empty, item.编号); - var item2 = g.kingbaseES.Select<测试中文表>().Where(a => a.编号 == item.编号).First(); - Assert.NotNull(item2); - Assert.Equal(item.编号, item2.编号); - Assert.Equal(item.标题, item2.标题); - - item.标题 = "测试标题更新"; - Assert.Equal(1, g.kingbaseES.Update<测试中文表>().SetSource(item).ExecuteAffrows()); - item2 = g.kingbaseES.Select<测试中文表>().Where(a => a.编号 == item.编号).First(); - Assert.NotNull(item2); - Assert.Equal(item.编号, item2.编号); - Assert.Equal(item.标题, item2.标题); - - item.标题 = "测试标题更新_repo"; - var repo = g.kingbaseES.GetRepository<测试中文表>(); - Assert.Equal(1, repo.Update(item)); - item2 = g.kingbaseES.Select<测试中文表>().Where(a => a.编号 == item.编号).First(); - Assert.NotNull(item2); - Assert.Equal(item.编号, item2.编号); - Assert.Equal(item.标题, item2.标题); - - item.标题 = "测试标题更新_repo22"; - Assert.Equal(1, repo.Update(item)); - item2 = g.kingbaseES.Select<测试中文表>().Where(a => a.编号 == item.编号).First(); - Assert.NotNull(item2); - Assert.Equal(item.编号, item2.编号); - Assert.Equal(item.标题, item2.标题); - } - class 测试中文表 + class 娴嬭瘯涓枃琛 { [Column(IsPrimary = true)] - public Guid 编号 { get; set; } + public Guid 缂栧彿 { get; set; } - public string 标题 { get; set; } + public string 鏍囬 { get; set; } - public DateTime 创建时间 { get; set; } + [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)] + public DateTime 鍒涘缓鏃堕棿 { get; set; } + + [Column(ServerTime = DateTimeKind.Local)] + public DateTime 鏇存柊鏃堕棿 { get; set; } } [Fact] @@ -164,7 +219,7 @@ namespace FreeSql.Tests.KingbaseES [Table(Name = "AddUniquesInfo", OldName = "AddUniquesInfo2")] [Index("{tablename}_uk_phone", "phone", true)] [Index("{tablename}_uk_group_index", "group,index", true)] - [Index("{tablename}_uk_group_index22", "group, index22", true)] + [Index("{tablename}_uk_group_index22", "group, index22", false)] class AddUniquesInfo { public Guid id { get; set; } @@ -174,26 +229,36 @@ namespace FreeSql.Tests.KingbaseES public int index { get; set; } public string index22 { get; set; } } + [Fact] public void AddField() { var sql = g.kingbaseES.CodeFirst.GetComparisonDDLStatements(); - + Assert.True(string.IsNullOrEmpty(sql)); //娴嬭瘯杩愯涓ゆ鍚 + g.kingbaseES.Select(); var id = g.kingbaseES.Insert().AppendData(new TopicAddField { }).ExecuteIdentity(); - - //var inserted = g.kingbaseES.Insert().AppendData(new TopicAddField { }).ExecuteInserted(); } - [Table(Name = "TopicAddField", OldName = "xxxtb.TopicAddField")] + [Table(Name = "ccc2.TopicAddField", OldName = "ccc.TopicAddField")] public class TopicAddField { [Column(IsIdentity = true)] public int Id { get; set; } - public string name { get; set; } + public string name { get; set; } = "xxx"; + + public int clicks { get; set; } = 10; + //public int name { get; set; } = 3000; + + //[Column(DbType = "varchar(200) not null", OldName = "title")] + //public string title222 { get; set; } = "333"; + + [Column(DbType = "varchar(200) not null")] + public string title222333 { get; set; } = "xxx"; + + //[Column(DbType = "varchar(100) not null", OldName = "title122333aaa")] + //public string titleaaa { get; set; } = "fsdf"; - [Column(DbType = "varchar2(200) not null", OldName = "title")] - public string title2 { get; set; } = "10"; [Column(IsIgnore = true)] public DateTime ct { get; set; } = DateTime.Now; @@ -202,9 +267,9 @@ namespace FreeSql.Tests.KingbaseES [Fact] public void GetComparisonDDLStatements() { + var sql = g.kingbaseES.CodeFirst.GetComparisonDDLStatements(); - Assert.True(string.IsNullOrEmpty(sql)); //测试运行两次后 - //sql = g.kingbaseES.CodeFirst.GetComparisonDDLStatements(); + g.kingbaseES.Select(); } IInsert insert => g.kingbaseES.Insert(); @@ -213,6 +278,9 @@ namespace FreeSql.Tests.KingbaseES [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(); @@ -220,83 +288,157 @@ namespace FreeSql.Tests.KingbaseES var item2 = new TableAllType { - Bool = true, - BoolNullable = true, - Byte = 255, - ByteNullable = 127, - Bytes = Encoding.UTF8.GetBytes("我是中国人"), - DateTime = DateTime.Now, - DateTimeNullable = DateTime.Now.AddHours(-1), - Decimal = 99.99M, - DecimalNullable = 99.98M, - Double = 999.99, - DoubleNullable = 999.98, - Enum1 = TableAllTypeEnumType1.e5, - Enum1Nullable = TableAllTypeEnumType1.e3, - Enum2 = TableAllTypeEnumType2.f2, - Enum2Nullable = TableAllTypeEnumType2.f3, - Float = 19.99F, - FloatNullable = 19.98F, - Guid = Guid.NewGuid(), - GuidNullable = Guid.NewGuid(), - Int = int.MaxValue, - IntNullable = int.MinValue, - SByte = 100, - SByteNullable = 99, - Short = short.MaxValue, - ShortNullable = short.MinValue, - String = "我是中国人string'\\?!@#$%^&*()_+{}}{~?><<>", - Char = 'X', - TimeSpan = TimeSpan.FromSeconds(999), - TimeSpanNullable = TimeSpan.FromSeconds(60), - UInt = uint.MaxValue, - UIntNullable = uint.MinValue, - ULong = ulong.MaxValue, - ULongNullable = ulong.MinValue, - UShort = ushort.MaxValue, - UShortNullable = ushort.MinValue, + 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 KdbndpRange(10, 20), + testFieldInt4rangeArray = new[] { new KdbndpRange(10, 20), new KdbndpRange(50, 100), new KdbndpRange(200, 300) }, + testFieldInt4rangeArrayNullable = new KdbndpRange?[] { new KdbndpRange(10, 20), new KdbndpRange(50, 100), null, new KdbndpRange(200, 300) }, + testFieldInt4rangeNullable = new KdbndpRange(100, 200), + testFieldInt8range = new KdbndpRange(100, 200), + testFieldInt8rangeArray = new[] { new KdbndpRange(100, 200), new KdbndpRange(500, 1000), new KdbndpRange(2000, 3000) }, + testFieldInt8rangeArrayNullable = new KdbndpRange?[] { new KdbndpRange(100, 200), new KdbndpRange(500, 1000), null, new KdbndpRange(2000, 3000) }, + testFieldInt8rangeNullable = new KdbndpRange(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") }, + testFieldKdbndpBox = new KdbndpBox(10, 100, 100, 10), + testFieldKdbndpBoxArray = new[] { new KdbndpBox(10, 100, 100, 10), new KdbndpBox(200, 2000, 2000, 200) }, + testFieldKdbndpBoxArrayNullable = new KdbndpBox?[] { new KdbndpBox(10, 100, 100, 10), null, new KdbndpBox(200, 2000, 2000, 200) }, + testFieldKdbndpBoxNullable = new KdbndpBox(200, 2000, 2000, 200), + testFieldKdbndpCircle = new KdbndpCircle(50, 50, 100), + testFieldKdbndpCircleArray = new[] { new KdbndpCircle(50, 50, 100), new KdbndpCircle(80, 80, 100) }, + testFieldKdbndpCircleArrayNullable = new KdbndpCircle?[] { new KdbndpCircle(50, 50, 100), null, new KdbndpCircle(80, 80, 100) }, + testFieldKdbndpCircleNullable = new KdbndpCircle(80, 80, 100), + testFieldKdbndpLine = new KdbndpLine(30, 30, 30), + testFieldKdbndpLineArray = new[] { new KdbndpLine(30, 30, 30), new KdbndpLine(35, 35, 35) }, + testFieldKdbndpLineArrayNullable = new KdbndpLine?[] { new KdbndpLine(30, 30, 30), null, new KdbndpLine(35, 35, 35) }, + testFieldKdbndpLineNullable = new KdbndpLine(60, 60, 60), + testFieldKdbndpLSeg = new KdbndpLSeg(80, 10, 800, 20), + testFieldKdbndpLSegArray = new[] { new KdbndpLSeg(80, 10, 800, 20), new KdbndpLSeg(180, 20, 260, 50) }, + testFieldKdbndpLSegArrayNullable = new KdbndpLSeg?[] { new KdbndpLSeg(80, 10, 800, 20), null, new KdbndpLSeg(180, 20, 260, 50) }, + testFieldKdbndpLSegNullable = new KdbndpLSeg(180, 20, 260, 50), + testFieldKdbndpPath = new KdbndpPath(new KdbndpPoint(10, 10), new KdbndpPoint(15, 10), new KdbndpPoint(17, 10), new KdbndpPoint(19, 10)), + testFieldKdbndpPathArray = new[] { new KdbndpPath(new KdbndpPoint(10, 10), new KdbndpPoint(15, 10), new KdbndpPoint(17, 10), new KdbndpPoint(19, 10)), new KdbndpPath(new KdbndpPoint(210, 10), new KdbndpPoint(215, 10), new KdbndpPoint(217, 10), new KdbndpPoint(219, 10)) }, + testFieldKdbndpPathArrayNullable = new KdbndpPath?[] { new KdbndpPath(new KdbndpPoint(10, 10), new KdbndpPoint(15, 10), new KdbndpPoint(17, 10), new KdbndpPoint(19, 10)), null, new KdbndpPath(new KdbndpPoint(210, 10), new KdbndpPoint(215, 10), new KdbndpPoint(217, 10), new KdbndpPoint(219, 10)) }, + testFieldKdbndpPathNullable = new KdbndpPath(new KdbndpPoint(210, 10), new KdbndpPoint(215, 10), new KdbndpPoint(217, 10), new KdbndpPoint(219, 10)), + testFieldKdbndpPoint = new KdbndpPoint(666, 666), + testFieldKdbndpPointArray = new[] { new KdbndpPoint(666, 666), new KdbndpPoint(888, 888) }, + testFieldKdbndpPointArrayNullable = new KdbndpPoint?[] { new KdbndpPoint(666, 666), null, new KdbndpPoint(888, 888) }, + testFieldKdbndpPointNullable = new KdbndpPoint(888, 888), + testFieldKdbndpPolygon = new KdbndpPolygon(new KdbndpPoint(36, 30), new KdbndpPoint(36, 50), new KdbndpPoint(38, 80), new KdbndpPoint(36, 30)), + testFieldKdbndpPolygonArray = new[] { new KdbndpPolygon(new KdbndpPoint(36, 30), new KdbndpPoint(36, 50), new KdbndpPoint(38, 80), new KdbndpPoint(36, 30)), new KdbndpPolygon(new KdbndpPoint(136, 130), new KdbndpPoint(136, 150), new KdbndpPoint(138, 180), new KdbndpPoint(136, 130)) }, + testFieldKdbndpPolygonArrayNullable = new KdbndpPolygon?[] { new KdbndpPolygon(new KdbndpPoint(36, 30), new KdbndpPoint(36, 50), new KdbndpPoint(38, 80), new KdbndpPoint(36, 30)), null, new KdbndpPolygon(new KdbndpPoint(136, 130), new KdbndpPoint(136, 150), new KdbndpPoint(138, 180), new KdbndpPoint(136, 130)) }, + testFieldKdbndpPolygonNullable = new KdbndpPolygon(new KdbndpPoint(136, 130), new KdbndpPoint(136, 150), new KdbndpPoint(138, 180), new KdbndpPoint(136, 130)), + testFieldNumrange = new KdbndpRange(888.88M, 999.99M), + testFieldNumrangeArray = new[] { new KdbndpRange(888.88M, 999.99M), new KdbndpRange(18888.88M, 19998.99M) }, + testFieldNumrangeArrayNullable = new KdbndpRange?[] { new KdbndpRange(888.88M, 999.99M), null, new KdbndpRange(18888.88M, 19998.99M) }, + testFieldNumrangeNullable = new KdbndpRange(18888.88M, 19998.99M), + + 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 = "鎴戞槸涓浗浜簊tring'\\?!@#$%^&*()_+{}}{~?><<>", + testFieldChar = 'X', + testFieldStringArray = new[] { "鎴戞槸涓浗浜篠tring1", "鎴戞槸涓浗浜篠tring2", null, "鎴戞槸涓浗浜篠tring3" }, + 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 KdbndpRange(DateTime.Now, DateTime.Now.AddMonths(1)), + testFieldTsrangeArray = new[] { new KdbndpRange(DateTime.Now, DateTime.Now.AddMonths(1)), new KdbndpRange(DateTime.Now, DateTime.Now.AddMonths(2)) }, + testFieldTsrangeArrayNullable = new KdbndpRange?[] { new KdbndpRange(DateTime.Now, DateTime.Now.AddMonths(1)), null, new KdbndpRange(DateTime.Now, DateTime.Now.AddMonths(2)) }, + testFieldTsrangeNullable = new KdbndpRange(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().ExecuteIdentity(); + var item3NP = insert.AppendData(item2).NoneParameter().ExecuteInserted(); - item2.Id = (int)insert.AppendData(item2).ExecuteIdentity(); - var newitem21 = select.Where(a => a.Id == item2.Id).First(a => new - { - a.Id, - a.id2, - a.SByte, - a.Short, - a.Int, - a.Long, - a.Byte, - a.UShort, - a.UInt, - a.ULong, - a.Double, - a.Float, - a.Decimal, - a.TimeSpan, - a.DateTimeOffSet, - a.Bytes, - a.String, - a.Char, - a.Guid - }); - var newitem22 = select.Where(a => a.Id == item2.Id).First(a => new - { - a.Id, a.id2, a.SByte, a.Short, a.Int, a.Long, a.Byte, a.UShort, a.UInt, a.ULong, a.Double, a.Float, a.Decimal, a.TimeSpan, a.DateTime, a.DateTimeOffSet, a.Bytes, a.String, a.Char, a.Guid - }); + 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); + Assert.Equal(item2.testFieldChar, newitem2.testFieldChar); - var newitem2 = select.Where(a => a.Id == item2.Id).ToOne(); - Assert.Equal(item2.String, newitem2.String); - Assert.Equal(item2.Char, newitem2.Char); - - item2.Id = (int)insert.NoneParameter().AppendData(item2).ExecuteIdentity(); - newitem2 = select.Where(a => a.Id == item2.Id).ToOne(); - Assert.Equal(item2.String, newitem2.String); - Assert.Equal(item2.Char, newitem2.Char); + 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); + Assert.Equal(item2.testFieldChar, newitem2.testFieldChar); var items = select.ToList(); var itemstb = select.ToDataTable(); @@ -308,49 +450,155 @@ namespace FreeSql.Tests.KingbaseES [Column(IsIdentity = true, IsPrimary = true)] public int Id { get; set; } - public string id2 { get; set; } = "id2=10"; + 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; } - public bool Bool { get; set; } - public sbyte SByte { get; set; } - public short Short { get; set; } - public int Int { get; set; } - public long Long { get; set; } - public byte Byte { get; set; } - public ushort UShort { get; set; } - public uint UInt { get; set; } - public ulong ULong { get; set; } - public double Double { get; set; } - public float Float { get; set; } - public decimal Decimal { get; set; } - public TimeSpan TimeSpan { get; set; } - public DateTime DateTime { get; set; } - public DateTime DateTimeOffSet { get; set; } - public byte[] Bytes { get; set; } - public string String { get; set; } - public char Char { get; set; } - public Guid Guid { get; set; } + [Column(ServerTime = DateTimeKind.Local)] + public DateTime testFieldDateTime { get; set; } - public bool? BoolNullable { get; set; } - public sbyte? SByteNullable { get; set; } - public short? ShortNullable { get; set; } - public int? IntNullable { get; set; } + public byte[] testFieldBytes { get; set; } + public string testFieldString { get; set; } + public char testFieldChar { get; set; } + public Guid testFieldGuid { get; set; } + public KdbndpPoint testFieldKdbndpPoint { get; set; } + public KdbndpLine testFieldKdbndpLine { get; set; } + public KdbndpLSeg testFieldKdbndpLSeg { get; set; } + public KdbndpBox testFieldKdbndpBox { get; set; } + public KdbndpPath testFieldKdbndpPath { get; set; } + public KdbndpPolygon testFieldKdbndpPolygon { get; set; } + public KdbndpCircle testFieldKdbndpCircle { get; set; } + public (IPAddress Address, int Subnet) testFieldCidr { get; set; } + public KdbndpRange testFieldInt4range { get; set; } + public KdbndpRange testFieldInt8range { get; set; } + public KdbndpRange testFieldNumrange { get; set; } + public KdbndpRange 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? ByteNullable { get; set; } - public ushort? UShortNullable { get; set; } - public uint? UIntNullable { get; set; } - public ulong? ULongNullable { get; set; } - public double? DoubleNullable { get; set; } - public float? FloatNullable { get; set; } - public decimal? DecimalNullable { get; set; } - public TimeSpan? TimeSpanNullable { get; set; } - public DateTime? DateTimeNullable { get; set; } - public DateTime? DateTimeOffSetNullable { get; set; } - public Guid? GuidNullable { 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; } - public TableAllTypeEnumType1 Enum1 { get; set; } - public TableAllTypeEnumType1? Enum1Nullable { get; set; } - public TableAllTypeEnumType2 Enum2 { get; set; } - public TableAllTypeEnumType2? Enum2Nullable { get; set; } + [Column(ServerTime = DateTimeKind.Local)] + public DateTime? testFieldDateTimeNullable { get; set; } + + public Guid? testFieldGuidNullable { get; set; } + public KdbndpPoint? testFieldKdbndpPointNullable { get; set; } + public KdbndpLine? testFieldKdbndpLineNullable { get; set; } + public KdbndpLSeg? testFieldKdbndpLSegNullable { get; set; } + public KdbndpBox? testFieldKdbndpBoxNullable { get; set; } + public KdbndpPath? testFieldKdbndpPathNullable { get; set; } + public KdbndpPolygon? testFieldKdbndpPolygonNullable { get; set; } + public KdbndpCircle? testFieldKdbndpCircleNullable { get; set; } + public (IPAddress Address, int Subnet)? testFieldCidrNullable { get; set; } + public KdbndpRange? testFieldInt4rangeNullable { get; set; } + public KdbndpRange? testFieldInt8rangeNullable { get; set; } + public KdbndpRange? testFieldNumrangeNullable { get; set; } + public KdbndpRange? 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 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 KdbndpPoint[] testFieldKdbndpPointArray { get; set; } + public KdbndpLine[] testFieldKdbndpLineArray { get; set; } + public KdbndpLSeg[] testFieldKdbndpLSegArray { get; set; } + public KdbndpBox[] testFieldKdbndpBoxArray { get; set; } + public KdbndpPath[] testFieldKdbndpPathArray { get; set; } + public KdbndpPolygon[] testFieldKdbndpPolygonArray { get; set; } + public KdbndpCircle[] testFieldKdbndpCircleArray { get; set; } + public (IPAddress Address, int Subnet)[] testFieldCidrArray { get; set; } + public KdbndpRange[] testFieldInt4rangeArray { get; set; } + public KdbndpRange[] testFieldInt8rangeArray { get; set; } + public KdbndpRange[] testFieldNumrangeArray { get; set; } + public KdbndpRange[] 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 KdbndpPoint?[] testFieldKdbndpPointArrayNullable { get; set; } + public KdbndpLine?[] testFieldKdbndpLineArrayNullable { get; set; } + public KdbndpLSeg?[] testFieldKdbndpLSegArrayNullable { get; set; } + public KdbndpBox?[] testFieldKdbndpBoxArrayNullable { get; set; } + public KdbndpPath?[] testFieldKdbndpPathArrayNullable { get; set; } + public KdbndpPolygon?[] testFieldKdbndpPolygonArrayNullable { get; set; } + public KdbndpCircle?[] testFieldKdbndpCircleArrayNullable { get; set; } + public (IPAddress Address, int Subnet)?[] testFieldCidrArrayNullable { get; set; } + public KdbndpRange?[] testFieldInt4rangeArrayNullable { get; set; } + public KdbndpRange?[] testFieldInt8rangeArrayNullable { get; set; } + public KdbndpRange?[] testFieldNumrangeArrayNullable { get; set; } + public KdbndpRange?[] 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 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 } diff --git a/FreeSql.Tests/FreeSql.Tests/g.cs b/FreeSql.Tests/FreeSql.Tests/g.cs index 7a36b9a5..c35216a2 100644 --- a/FreeSql.Tests/FreeSql.Tests/g.cs +++ b/FreeSql.Tests/FreeSql.Tests/g.cs @@ -158,7 +158,7 @@ public class g public static IFreeSql shentong => shentongLazy.Value; static Lazy kingbaseESLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.KingbaseES, "Server=121.36.59.173;Port=54321;UID=system;PWD=abc.123;database=test;max pool size=4") + .UseConnectionString(FreeSql.DataType.KingbaseES, "Server=123.57.239.39;Port=54322;UID=system;PWD=123456;database=test;max pool size=4") //.UseConnectionFactory(FreeSql.DataType.KingbaseES, () => new Kdbndp.KdbndpConnection("Server=127.0.0.1;Port=54321;UID=USER2;PWD=123456789;database=TDB2")) .UseAutoSyncStructure(true) .UseLazyLoading(true) diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index c021f7a9..5830ec40 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2796,85 +2796,6 @@ lambda琛ㄨ揪寮 - - - 鎸夊垪鎺掑簭锛孫rderBy(a => a.Time) - - - - - - - - 瀹炵幇 select .. from ( select ... from t ) a 杩欐牱鐨勫姛鑳 - 浣跨敤 AsTable 鏂规硶涔熷彲浠ヨ揪鍒版晥鏋 - 绀轰緥锛歐ithSql("select * from id=@id", new { id = 1 }) - 鎻愮ず锛歱arms 鍙傛暟杩樺彲浠ヤ紶 Dictionary<string, object> - - SQL璇彞 - 鍙傛暟 - - - - - 瀹炵幇 select .. from ( select .. UNION ALL select .. ) a 杩欐牱鐨勫姛鑳斤紙鍩轰簬鍐呭瓨鏁版嵁锛 - - 鍐呭瓨鏁版嵁 - - - - - 宓屽鏌ヨ select * from ( select ... from table ... ) a - - - - - - - - 鏌ヨ鏉′欢锛學here(a => a.Id > 10)锛屾敮鎸佸鑸璞℃煡璇紝Where(a => a.Author.Email == "2881099@qq.com") - - lambda琛ㄨ揪寮 - - - - - 鏌ヨ鏉′欢锛學here(true, a => a.Id > 10)锛屾敮瀵艰埅瀵硅薄鏌ヨ锛學here(true, a => a.Author.Email == "2881099@qq.com") - - true 鏃剁敓鏁 - lambda琛ㄨ揪寮 - - - - - 鎸夊垪鎺掑簭锛孫rderBy(a => a.Time) - - - - - - - - 鎸夊垪鍊掑悜鎺掑簭锛孫rderByDescending(a => a.Time) - - 鍒 - - - - - 鎸夎仛鍚堟潯浠惰繃婊わ紝Having(a => a.Count() > 10) - - lambda琛ㄨ揪寮 - - - - - 鎸夎仛鍚堟潯浠惰繃婊わ紝HavingIf(true, a => a.Count() > 10) - - true 鏃剁敓鏁 - lambda琛ㄨ揪寮 - - 鎸夊垪鎺掑簭锛孫rderBy(a => a.Time) @@ -3984,7 +3905,355 @@ - 鏍囪瘑绗︼紝鍙皢 CurdBefore 涓 CurdAfter 杩涜 琛ㄥ悕锛屽锛歞bo.table1 + 鏍囪瘑绗︼紝鍙皢 CurdBefore 涓 CurdAfter 杩涜鍖归厤 + + + + + 鎿嶄綔绫诲瀷 + + + + + 瀹炰綋绫诲瀷 + + + + + 瀹炰綋绫诲瀷鐨勫厓鏁版嵁 + + + + + 鎵ц鐨 SQL + + + + + 鍙傛暟鍖栧懡浠 + + + + + 鐘舵佹暟鎹紝鍙笌 CurdAfter 鍏变韩 + + + + + 鍙戠敓鐨勯敊璇 + + + + + 鎵цSQL鍛戒护锛岃繑鍥炵殑缁撴灉 + + + + + 鑰楁椂锛堝崟浣嶏細Ticks锛 + + + + + 鑰楁椂锛堝崟浣嶏細姣锛 + + + + + 鏍囪瘑绗︼紝鍙皢 SyncStructureBeforeEventArgs 涓 SyncStructureAfterEventArgs 杩涜鍖归厤 + + + + + 瀹炰綋绫诲瀷 + + + + + 鐘舵佹暟鎹紝鍙笌 SyncStructureAfter 鍏变韩 + + + + + 鎵ц鐨 SQL + + + + + 鍙戠敓鐨勯敊璇 + + + + + 鑰楁椂锛堝崟浣嶏細Ticks锛 + + + + + 鑰楁椂锛堝崟浣嶏細姣锛 + + + + + 绫诲瀷 + + + + + 灞炴у垪鐨勫厓鏁版嵁 + + + + + 鍙嶅皠鐨勫睘鎬т俊鎭 + + + + + 鑾峰彇瀹炰綋鐨勫睘鎬у硷紝涔熷彲浠ヨ缃疄浣撶殑灞炴ф柊鍊 + + + + + 瀹炰綋瀵硅薄 + + + + + 涓柇瀹炰綋瀵硅薄瀹¤ + false: 姣忎釜瀹炰綋瀵硅薄鐨勫睘鎬ч兘浼氬璁★紙榛樿锛 + true: 姣忎釜瀹炰綋瀵硅薄鍙璁′竴娆 + + + + + ADO.NET 鏁版嵁娴佽鍙栧璞 + + + + + DataReader 瀵瑰簲鐨 Index 浣嶇疆 + + + + + DataReader 瀵瑰簲鐨 PropertyInfo + + + + + 鑾峰彇 Index 瀵瑰簲鐨勫硷紝涔熷彲浠ヨ缃嫤鎴殑鏂板 + + + + + 鏍囪瘑绗︼紝鍙皢 CommandBefore 涓 CommandAfter 杩涜鍖归厤 + + + + + 鐘舵佹暟鎹紝鍙笌 CommandAfter 鍏变韩 + + + + + 鍙戠敓鐨勯敊璇 + + + + + 鎵цSQL鍛戒护锛岃繑鍥炵殑缁撴灉 + + + + + 鑰楁椂锛堝崟浣嶏細Ticks锛 + + + + + 鑰楁椂锛堝崟浣嶏細姣锛 + + + + + 鏍囪瘑绗︼紝鍙皢 TraceBeforeEventArgs 涓 TraceAfterEventArgs 杩涜鍖归厤 + + + + + 鐘舵佹暟鎹紝鍙笌 TraceAfter 鍏变韩 + + + + + 澶囨敞 + + + + + 鍙戠敓鐨勯敊璇 + + + + + 鑰楁椂锛堝崟浣嶏細Ticks锛 + + + + + 鑰楁椂锛堝崟浣嶏細姣锛 + + + + + 銆愬紑鍙戠幆澧冨繀澶囥戣嚜鍔ㄥ悓姝ュ疄浣撶粨鏋勫埌鏁版嵁搴擄紝绋嬪簭杩愯涓鏌ュ疄浣撹〃鏄惁瀛樺湪锛岀劧鍚庡垱寤烘垨淇敼 + + + + + 杞皬鍐欏悓姝ョ粨鏋勶紝閫傜敤 PostgreSQL + + + + + 杞ぇ鍐欏悓姝ョ粨鏋勶紝閫傜敤 Oracle/杈炬ⅵ/浜哄ぇ閲戜粨 + + + + + 灏嗘暟鎹簱鐨勪富閿佽嚜澧炪佺储寮曡缃鍏ワ紝閫傜敤 DbFirst 妯″紡锛屾棤椤诲湪瀹炰綋绫诲瀷涓婅缃 [Column(IsPrimary)] 鎴栬 ConfigEntity銆傛鍔熻兘鐩墠鍙敤浜 mysql/sqlserver/postgresql/oracle銆 + 鏈姛鑳戒細褰卞搷 IFreeSql 棣栨璁块棶鐨勯熷害銆 + 鑻ヤ娇鐢 CodeFirst 鍒涘缓绱㈠紩鍚庯紝鍙堢洿鎺ュ湪鏁版嵁搴撲笂寤轰簡绱㈠紩锛岃嫢鏃犳湰鍔熻兘涓嬩竴娆 CodeFirst 杩佺Щ鏃舵暟鎹簱涓婂垱寤虹殑绱㈠紩灏嗚鍒犻櫎 + + + + + 涓嶄娇鐢ㄥ懡浠ゅ弬鏁板寲鎵ц锛岄拡瀵 Insert/Update + + + + + 鏄惁鐢熸垚鍛戒护鍙傛暟鍖栨墽琛岋紝閽堝 lambda 琛ㄨ揪寮忚В鏋 + 娉ㄦ剰锛氬父閲忎笉浼氬弬鏁板寲锛屽彉閲忔墠浼氬仛鍙傛暟鍖 + var id = 100; + fsql.Select<T>().Where(a => a.id == id) 浼氬弬鏁板寲 + fsql.Select<T>().Where(a => a.id == 100) 涓嶄細鍙傛暟鍖 + + + + + 寤舵椂鍔犺浇瀵艰埅灞炴у璞★紝瀵艰埅灞炴ч渶瑕佸0鏄 virtual + + + + + 灏嗗疄浣撶被鍨嬩笌鏁版嵁搴撳姣旓紝杩斿洖DDL璇彞 + + + + + + + 灏嗗疄浣撶被鍨嬮泦鍚堜笌鏁版嵁搴撳姣旓紝杩斿洖DDL璇彞 + + 瀹炰綋绫诲瀷 + + + + + 灏嗗疄浣撶被鍨嬩笌鏁版嵁搴撳姣旓紝杩斿洖DDL璇彞锛堟寚瀹氳〃鍚嶏級 + + 瀹炰綋绫诲瀷 + 鎸囧畾琛ㄥ悕瀵规瘮 + + + + + 鍚屾瀹炰綋绫诲瀷鍒版暟鎹簱 + 娉ㄦ剰锛氱敓浜х幆澧冧腑璋ㄦ厧浣跨敤 + + + + + + 鍚屾瀹炰綋绫诲瀷闆嗗悎鍒版暟鎹簱 + 娉ㄦ剰锛氱敓浜х幆澧冧腑璋ㄦ厧浣跨敤 + + + + + + 鍚屾瀹炰綋绫诲瀷鍒版暟鎹簱锛堟寚瀹氳〃鍚嶏級 + 娉ㄦ剰锛氱敓浜х幆澧冧腑璋ㄦ厧浣跨敤 + + 瀹炰綋绫诲瀷 + 鎸囧畾琛ㄥ悕瀵规瘮 + 寮哄埗鍚屾缁撴瀯锛屾棤瑙嗙紦瀛樻瘡娆¢兘鍚屾 + + + + 鏍规嵁 System.Type 鑾峰彇鏁版嵁搴撲俊鎭 + + + + + + + FreeSql FluentApi 閰嶇疆瀹炰綋锛屾柟娉曞悕涓庣壒鎬х浉鍚 + + + + + + + + FreeSql FluentApi 閰嶇疆瀹炰綋锛屾柟娉曞悕涓庣壒鎬х浉鍚 + + + + + + + + 鑾峰彇 FreeSql FluentApi 閰嶇疆瀹炰綋鐨勫厓鏁版嵁 + + + 鏈娇鐢–onfigEntity閰嶇疆鏃讹紝杩斿洖null + + + + 鑾峰彇瀹炰綋绫绘牳蹇冮厤缃 + + + + + + + 鑾峰彇鎵鏈夋暟鎹簱 + + + + + + 鑾峰彇鎸囧畾鏁版嵁搴撶殑琛ㄤ俊鎭紝鍖呮嫭琛ㄣ佸垪璇︽儏銆佷富閿佸敮涓閿佺储寮曘佸閿佸娉 + + + + + + + 鑾峰彇鎸囧畾鍗曡〃淇℃伅锛屽寘鎷垪璇︽儏銆佷富閿佸敮涓閿佺储寮曘佸娉 + + 琛ㄥ悕锛屽锛歞bo.table1 + 鏄惁蹇界暐澶у皬鍐 + + + + + 鍒ゆ柇琛ㄦ槸鍚﹀瓨鍦 + + 琛ㄥ悕锛屽锛歞bo.table1 鏄惁蹇界暐澶у皬鍐 @@ -4358,397 +4627,63 @@ - like - - - - 鍙嶅簭鍒楀寲 - - - - - - - 鑾峰彇鏁版嵁搴撴灇涓剧被鍨嬶紝閫傜敤 PostgreSQL - - - - - - - 涓存椂 LambdaExpression.Parameter - - - - - 濡傛灉瀹炰綋绫绘湁鑷灞炴э紝鍒嗘垚涓や釜 List锛屾湁鍊肩殑Item1 merge锛屾棤鍊肩殑Item2 insert - - - - - - - AsType, Ctor, ClearData 涓夊鍦版柟闇瑕侀噸鏂板姞杞 - - - - - AsType, Ctor, ClearData 涓夊鍦版柟闇瑕侀噸鏂板姞杞 - - - - - 鍔ㄦ佽鍙 DescriptionAttribute 娉ㄩ噴鏂囨湰 - - - - - - - 閫氳繃灞炴х殑娉ㄩ噴鏂囨湰锛岄氳繃 xml 璇诲彇 - - - Dict锛歬ey=灞炴у悕锛寁alue=娉ㄩ噴 - - - - 鏇存柊瀹炰綋鐨勫厓鏁版嵁 - - - - - 鎵ц鏇存柊鐨 SQL - - - - - 鎵ц鏇存柊鍛戒护鐨勫弬鏁 - - - - - 鎵ц鏇存柊鍛戒护褰卞搷鐨勮 - - - - - 鏇存柊鐨勫疄浣撴暟閲 - - - - - 鏇存柊鐨勫疄浣 - - - - - 鏄犲皠浼樺厛绾э紝榛樿锛 Attribute > FluentApi > Aop - - - - - 瀹炰綋鐗规 - [Table(Name = "tabname")] - [Column(Name = "table_id")] - - - - - 娴佸紡鎺ュ彛 - fsql.CodeFirst.ConfigEntity(a => a.Name("tabname")) - fsql.CodeFirst.ConfigEn, string value) => value; - } - } - - - - - 鎺堟潈 DynamicFilter 鏀寔 Custom 鑷畾涔夎В鏋 - - - - - 鏄惁鏀惧純缁х画璇诲彇 - - - - - 涓棿琛紝澶氬澶 - - - - - PostgreSQL 鏁扮粍绫诲瀷涓撳睘鍔熻兘 - 鏂瑰紡涓锛歴elect * from Role where Id in (RoleIds) - class User { - ____public int[] RoleIds { get; set; } - ____[Navigate(nameof(RoleIds))] - ____public List<Role> Roles { get; set; } - } - 鏂瑰紡浜岋細select * from User where RoleIds @> Id - class Role { - ____public int Id { get; set; } - ____[Navigate(nameof(User.RoleIds))] - ____public List<User> Users { get; set; } - } - - - - - 鏄惁鍙敤 - - - - - 涓嶅彲鐢ㄩ敊璇 - - - - - 涓嶅彲鐢ㄦ椂闂 - - - - - 灏嗗璞℃睜璁剧疆涓轰笉鍙敤锛屽悗缁 Get/GetAsync 鍧囦細鎶ラ敊锛屽悓鏃跺惎鍔ㄥ悗鍙板畾鏃舵鏌ユ湇鍔℃仮澶嶅彲鐢 - - - - 鐢便愬彲鐢ㄣ戝彉鎴愩愪笉鍙敤銆戞椂杩斿洖true锛屽惁鍒欒繑鍥瀎alse - - - - 缁熻瀵硅薄姹犱腑鐨勫璞 - - - - - 缁熻瀵硅薄姹犱腑鐨勫璞★紙瀹屾暣) - - - - - 鑾峰彇璧勬簮 - - 瓒呮椂 - - - - - 浣跨敤瀹屾瘯鍚庯紝褰掕繕璧勬簮 - - 瀵硅薄 - 鏄惁閲嶆柊鍒涘缓 - - - - 鍚嶇О - - - - - 姹犲閲 - - - - - 榛樿鑾峰彇瓒呮椂璁剧疆 - - - - - 绌洪棽鏃堕棿锛岃幏鍙栨椂鑻ヨ秴鍑猴紝鍒欓噸鏂板垱寤 - - - - - 寮傛鑾峰彇鎺掗槦闃熷垪澶у皬锛屽皬浜庣瓑浜0涓嶇敓鏁 - - - - - 鑾峰彇瓒呮椂鍚庯紝鏄惁鎶涘嚭寮傚父 - - - - - 鐩戝惉 AppDomain.CurrentDomain.ProcessExit/Console.CancelKeyPress 浜嬩欢鑷姩閲婃斁 + like - + - 鍚庡彴瀹氭椂妫鏌ュ彲鐢ㄦч棿闅旂鏁 + = + Equal/Equals/Eq 鏁堟灉鐩稿悓 - + - 鏉冮噸 + = + Equal/Equals/Eq 鏁堟灉鐩稿悓 - + - 瀵硅薄姹犵殑瀵硅薄琚垱寤烘椂 + = + Equal/Equals/Eq 鏁堟灉鐩稿悓 - 杩斿洖琚垱寤虹殑瀵硅薄 - + - 閿姣佸璞 + <> - 璧勬簮瀵硅薄 - + - 浠庡璞℃睜鑾峰彇瀵硅薄瓒呮椂鐨勬椂鍊欒Е鍙戯紝閫氳繃璇ユ柟娉曠粺璁 + > - + - 浠庡璞℃睜鑾峰彇瀵硅薄鎴愬姛鐨勬椂鍊欒Е鍙戯紝閫氳繃璇ユ柟娉曠粺璁℃垨鍒濆鍖栧璞 + >= - 璧勬簮瀵硅薄 - + - 褰掕繕瀵硅薄缁欏璞℃睜鐨勬椂鍊欒Е鍙 + < - 璧勬簮瀵硅薄 - + - 妫鏌ュ彲鐢ㄦ + <= - 璧勬簮瀵硅薄 - - + - 浜嬩欢锛氬彲鐢ㄦ椂瑙﹀彂 + >= and < + 姝ゆ椂 Value 鐨勫兼牸寮忎负閫楀彿鍒嗗壊锛歷alue1,value2 鎴栬呮暟缁 - + - 浜嬩欢锛氫笉鍙敤鏃惰Е鍙 - - - - - 鎵灞炲璞℃睜 - - - - - 鍦ㄥ璞℃睜涓殑鍞竴鏍囪瘑 - - - - - 璧勬簮瀵硅薄 - - - - - 琚幏鍙栫殑鎬绘鏁 - - - - 鏈鍚庤幏鍙栨椂鐨勬椂闂 - - - - 鏈鍚庡綊杩樻椂鐨勬椂闂 - - - - - 鍒涘缓鏃堕棿 - - - - - 鏈鍚庤幏鍙栨椂鐨勭嚎绋媔d - - - - - 鏈鍚庡綊杩樻椂鐨勭嚎绋媔d - - - - - 閲嶇疆 Value 鍊 - - - - - 瀵硅薄姹犵鐞嗙被 - - 瀵硅薄绫诲瀷 - - - - 鍚庡彴瀹氭椂妫鏌ュ彲鐢ㄦ - - - - - - 鍒涘缓瀵硅薄姹 - - 姹犲ぇ灏 - 姹犲唴瀵硅薄鐨勫垱寤哄鎵 - 鑾峰彇姹犲唴瀵硅薄鎴愬姛鍚庯紝杩涜浣跨敤鍓嶆搷浣 - - - - 鍒涘缓瀵硅薄姹 - - 绛栫暐 - - - - 鑾峰彇鍙敤璧勬簮锛屾垨鍒涘缓璧勬簮 - - - - - - 鐢ㄤ簬瑙e喅澶氬疄渚嬫儏鍐典笅鐨勯潤鎬侀泦鍚堢紦瀛橀棶棰 - - - - - - String resources used in FreeSql exceptions, etc. - - - These strings are exposed publicly for use by database providers and extensions. - It is unusual for application code to need these strings. - - - - - - 閲嶅啓褰撳墠绾跨▼鐨 CurrentUICulture 灞炴э紝瀵 - 浣跨敤姝ゅ己绫诲瀷璧勬簮绫荤殑鎵鏈夎祫婧愭煡鎵炬墽琛岄噸鍐欍 - - - - - [Table(AsTable = "{asTable}")] 鐗规у兼牸寮忛敊璇 - - - - - [Table(AsTable = xx)] 璁剧疆鐨勫睘鎬у悕 {atmGroupsValue} 涓嶆槸 DateTime 绫诲瀷 - - - - - {name}: Failed to get resource {statistics} - - - - 瀵艰埅灞炴 {trytbTypeName}.{pnvName} 娌℃湁鎵惧埌瀵瑰簲鐨勫瓧娈碉紝濡傦細{pnvName}{findtbrefPkCsName}銆亄pnvName}_{findtbrefPkCsName}銆傛垨鑰呬娇鐢 [Navigate] 鐗规ф寚瀹氬 + 瀵艰埅灞炴 {trytbTypeName}.{pnvName} 娌℃湁鎵惧埌瀵瑰簲鐨勫瓧娈碉紝濡傦細{pnvName}{findtbrefPkCsName}銆亄pnvName}_{findtbrefPkCsName}銆傛垨鑰呬娇鐢 [Navigate] 鐗规ф寚瀹氬叧绯绘槧灏勩 + + + + + 瀵艰埅灞炴 {trytbTypeName}.{pnvName} 瑙f瀽閿欒锛屽疄浣撶被鍨 {trytcTypeName} 缂哄皯涓婚敭鏍囪瘑锛孾Column(IsPrimary = true)] + + + + + 瀵艰埅灞炴 {trytbTypeName}.{pnvName} 瑙f瀽閿欒锛寋trytbCsName}.{trycolCsName} 鍜 {tbrefCsName}.{tbrefPrimarysCsName} 绫诲瀷涓嶄竴鑷 + + + + + 瀵艰埅灞炴 {trytbTypeName}.{pnvName} 鐗规 [Navigate] 瑙f瀽閿欒锛屽湪 {tbrefTypeName} 鏈壘鍒板睘鎬э細{bi} + + + + + {tableTypeDisplayCsharp} 娌℃湁瀹氫箟涓婚敭锛屾棤娉曚娇鐢 SetSource锛岃灏濊瘯 SetDto 鎴栬 SetSource 鎸囧畾涓存椂涓婚敭 + + + + + 娌℃湁瀹氫箟灞炴 + + + + + 鏈疄鐜 + + + + + 鏈疄鐜板嚱鏁拌〃杈惧紡 {exp} 瑙f瀽 + + + + + 鏈疄鐜板嚱鏁拌〃杈惧紡 {exp} 瑙f瀽锛屽弬鏁 {expArguments} 蹇呴』涓哄父閲 + + + + + 鏈疄鐜板嚱鏁拌〃杈惧紡 {exp} 瑙f瀽锛屽鏋滄鍦ㄦ搷浣滃鑸睘鎬ч泦鍚堬紝璇蜂娇鐢 .AsSelect().{exp3MethodName}({exp3ArgumentsCount}) + + + + + 鏈疄鐜 MemberAccess 涓嬬殑 Constant + + + + + 鏈疄鐜 {name} + + + + + 涓嶆敮鎸 + + + + + {dataType} 涓嶆敮鎸 OrderByRandom 闅忔満鎺掑簭 + + + + + {property} 涓嶆槸鏈夋晥鐨勫鑸睘鎬 + + + + + {dbName} 鎵句笉鍒板垪 {memberName} + + + + + 鎵句笉鍒 {CsName} 瀵瑰簲鐨勫垪 + + + + + 鎵句笉鍒板睘鎬э細{memberName} + + + + + 鎵句笉鍒板睘鎬у悕 {proto} + + + + + Custom 鎵句笉鍒板搴旂殑{{ 鍙嶅皠淇℃伅 }}锛歿fiValueCustomArray} + + + + + Custom 鎵句笉鍒板搴旂殑{{ 闈欐佹柟娉曞悕 }}锛歿fiValueCustomArray} + + + + + [Table(AsTable = xx)] 璁剧疆鐨勫睘鎬у悕 {atmGroupsValue} 涓嶅瓨鍦 + + + + + 鏈寚瀹 UseConnectionString 鎴栬 UseConnectionFactory + + + + + 銆恵policyName}銆慜bjectPool.{GetName}() timeout {totalSeconds} seconds, see: https://github.com/dotnetcore/FreeSql/discussions/1081 + + + + + 銆恵policyName}銆慜bjectPool.GetAsync() The queue is too long. Policy.AsyncGetCapacity = {asyncGetCapacity} + + + + + 銆怬neToMany銆戝鑸睘鎬 {trytbTypeName}.{pnvName} 鍦 {tbrefCsName} 涓病鏈夋壘鍒板搴旂殑瀛楁锛屽锛歿findtrytb}{findtrytbPkCsName}銆亄findtrytb}_{findtrytbPkCsName} + + + + + 銆怬neToMany銆戝鑸睘鎬 {trytbTypeName}.{pnvName} 瑙f瀽閿欒锛寋trytbCsName}.{trytbPrimarysCsName} 鍜 {tbrefCsName}.{trycolCsName} 绫诲瀷涓嶄竴鑷 + + + + + 銆亄refpropName}{findtrytbPkCsName}銆亄refpropName}_{findtrytbPkCsName}銆傛垨鑰呬娇鐢 [Navigate] 鐗规ф寚瀹氬叧绯绘槧灏勩 + + + + + 鍙傛暟 field 鏈寚瀹 + + + + + {property} 鍙傛暟閿欒锛屽畠涓嶆槸闆嗗悎灞炴э紝蹇呴』涓 IList<T> 鎴栬 ICollection<T> + + + + + {property} 鍙傛暟閿欒锛屽畠涓嶆槸鏈夋晥鐨勫鑸睘鎬 + + + + + {where} 鍙傛暟閿欒锛寋keyval} 涓嶆槸鏈夋晥鐨勫睘鎬у悕锛屽湪瀹炰綋绫 {reftbTypeDisplayCsharp} 鏃犳硶鎵惧埌 + + + + + {property} 鍙傛暟閿欒锛屾牸寮 "TopicId=Id锛屽缁勪娇鐢ㄩ楀彿杩炴帴" + + + + + 瑙f瀽澶辫触 {callExpMethodName} {message} + + + + + 銆恵policyName}銆慣he ObjectPool has been disposed, see: https://github.com/dotnetcore/FreeSql/discussions/1079 + + + + + 銆恵policyName}銆戠姸鎬佷笉鍙敤锛岀瓑寰呭悗鍙版鏌ョ▼搴忔仮澶嶆柟鍙娇鐢ㄣ倇UnavailableExceptionMessage} + + + + + 灞炴trytbVersionColumnCsName} 琚爣娉ㄤ负琛岄攣锛堜箰瑙傞攣锛(IsVersion)锛屼絾鍏跺繀椤讳负鏁板瓧绫诲瀷 鎴栬 byte[] 鎴栬 string锛屽苟涓斾笉鍙负 Nullable + + + + + properties 鍙傛暟涓嶈兘涓虹┖ + + + + + {property} 灞炴у悕鏃犳硶鎵惧埌 + + + + + Range 瑕佹眰 Value 搴旇閫楀彿鍒嗗壊锛屽苟涓旈暱搴︿负 2 + + + + + 鍥炴粴 + + + + + 杩愯鏃堕敊璇紝鍙嶅皠鑾峰彇 IncludeMany 鏂规硶澶辫触 + + + + + 铔嬬柤鐨 Access 鎻掑叆鍙兘涓鏉′竴鏉℃墽琛岋紝涓嶆敮鎸 values(..),(..) 涔熶笉鏀寔 select .. UNION ALL select .. + + + + + BaseEntity.Initialization 鍒濆鍖栭敊璇紝鑾峰彇鍒 IFreeSql 鏄 null + + + + + 銆恵thisName}銆態lock access and wait for recovery: {exMessage} + + + + + 鏃犳硶灏 IQueryable<{typeofName}> 杞崲涓 ISelect<{typeofName}>锛屽洜涓轰粬鐨勫疄鐜颁笉鏄 FreeSql.Extensions.Linq.QueryableProvider + + + + + 杩炴帴瀛楃涓查敊璇 + + + + + 銆恵thisName}銆戣繛鎺ュ瓧绗︿覆閿欒锛岃妫鏌ャ + + + + + 杩炴帴瀛楃涓查敊璇紝鎴栬呮鏌ラ」鐩睘鎬 > 鐢熸垚 > 鐩爣骞冲彴锛歺86 | x64锛屾垨鑰呮敼鐢 FreeSql.Provider.SqliteCore 璁块棶 arm 骞冲彴 + + + + + 銆恵thisName}銆戣繛鎺ュ瓧绗︿覆閿欒锛岃妫鏌ャ傛垨鑰呮鏌ラ」鐩睘鎬 > 鐢熸垚 > 鐩爣骞冲彴锛歺86 | x64锛屾垨鑰呮敼鐢 FreeSql.Provider.SqliteCore 璁块棶 arm 骞冲彴 + + + + + FreeSql.Provider.CustomAdapter 鏃犳硶浣跨敤 CreateCommand + + + + + FreeSql.Provider.CustomAdapter 浠呮敮鎸 UseConnectionFactory 鏂瑰紡鏋勫缓 IFreeSql + + + + + 杈炬ⅵ CodeFirst 涓嶆敮鎸佷唬鐮佸垱寤 tablespace 涓 schemas {tbname} + + + + + -DB 鍙傛暟閿欒锛屾湭鎻愪緵 ConnectionString + + + + + -DB 鍙傛暟閿欒锛屾牸寮忎负锛歁ySql,ConnectionString + + + + + -DB 鍙傛暟閿欒锛屼笉鏀寔鐨勭被鍨嬶細"{dbargs}" + + + + + {method} 鏄 FreeSql.Provider.{provider} 鐗规湁鐨勫姛鑳 + + + + + fsql.InsertOrUpdate Sqlite 鏃犳硶瀹屾垚 UpdateColumns 鎿嶄綔 + + + + + 涓诲簱 + + + + + MygisGeometry.Parse 鏈疄鐜 "{wkt}" + + + + + -NameOptions 鍙傛暟閿欒锛屾牸寮忎负锛0,0,0,0 + + 鏈疄鐜拌鍔熻兘 @@ -6105,315 +6342,4 @@ - - - - - - 灏 lambda 琛ㄨ揪寮忓彇鍙 - - - true 鏃剁敓鏁 - - - - - 浣跨敤 and 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - - - - 浣跨敤 and 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - true 鏃剁敓鏁 - - - - - - 浣跨敤 or 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - - - - 浣跨敤 or 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - true 鏃剁敓鏁 - - - - - - 灏 lambda 琛ㄨ揪寮忓彇鍙 - - - true 鏃剁敓鏁 - - - - - 浣跨敤 and 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - - - - 浣跨敤 and 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - true 鏃剁敓鏁 - - - - - - 浣跨敤 or 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - - - - 浣跨敤 or 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - true 鏃剁敓鏁 - - - - - - 灏 lambda 琛ㄨ揪寮忓彇鍙 - - - true 鏃剁敓鏁 - - - - - 浣跨敤 and 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - - - - 浣跨敤 and 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - true 鏃剁敓鏁 - - - - - - 浣跨敤 or 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - - - - 浣跨敤 or 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - true 鏃剁敓鏁 - - - - - - 灏 lambda 琛ㄨ揪寮忓彇鍙 - - - true 鏃剁敓鏁 - - - - - 浣跨敤 and 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - - - - 浣跨敤 and 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - true 鏃剁敓鏁 - - - - - - 浣跨敤 or 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - - - - 浣跨敤 or 鎷兼帴涓や釜 lambda 琛ㄨ揪寮 - - - true 鏃剁敓鏁 - - - - - - 灏 lambda 琛ㄨ揪寮忓彇鍙 - - - true 鏃剁敓鏁 - - - - - 鐢熸垚绫讳技Mongodb鐨凮bjectId鏈夊簭銆佷笉閲嶅Guid - - - - - - 鎻掑叆鏁版嵁 - - - - - - - 鎻掑叆鏁版嵁锛屼紶鍏ュ疄浣 - - - - - - - - 鎻掑叆鏁版嵁锛屼紶鍏ュ疄浣撴暟缁 - - - - - - - - 鎻掑叆鏁版嵁锛屼紶鍏ュ疄浣撻泦鍚 - - - - - - - - 鎻掑叆鏁版嵁锛屼紶鍏ュ疄浣撻泦鍚 - - - - - - - - 鎻掑叆鎴栨洿鏂版暟鎹紝姝ゅ姛鑳戒緷璧栨暟鎹簱鐗规э紙浣庣増鏈彲鑳戒笉鏀寔锛夛紝鍙傝冨涓嬶細 - MySql 5.6+: on duplicate key update - PostgreSQL 9.4+: on conflict do update - SqlServer 2008+: merge into - Oracle 11+: merge into - Sqlite: replace into - 杈炬ⅵ: merge into - 浜哄ぇ閲戜粨锛歰n conflict do update - 绁為氾細merge into - MsAccess锛氫笉鏀寔 - 娉ㄦ剰鍖哄埆锛欶reeSql.Repository 浠撳偍涔熸湁 InsertOrUpdate 鏂规硶锛堜笉渚濊禆鏁版嵁搴撶壒鎬э級 - - - - - - - 淇敼鏁版嵁 - - - - - - - 淇敼鏁版嵁锛屼紶鍏ュ姩鎬佹潯浠讹紝濡傦細涓婚敭鍊 | new[]{涓婚敭鍊1,涓婚敭鍊2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 涓婚敭鍊笺佷富閿奸泦鍚堛佸疄浣撱佸疄浣撻泦鍚堛佸尶鍚嶅璞°佸尶鍚嶅璞¢泦鍚 - - - - - 鏌ヨ鏁版嵁 - - - - - - - 鏌ヨ鏁版嵁锛屼紶鍏ュ姩鎬佹潯浠讹紝濡傦細涓婚敭鍊 | new[]{涓婚敭鍊1,涓婚敭鍊2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 涓婚敭鍊笺佷富閿奸泦鍚堛佸疄浣撱佸疄浣撻泦鍚堛佸尶鍚嶅璞°佸尶鍚嶅璞¢泦鍚 - - - - - 鍒犻櫎鏁版嵁 - - - - - - - 鍒犻櫎鏁版嵁锛屼紶鍏ュ姩鎬佹潯浠讹紝濡傦細涓婚敭鍊 | new[]{涓婚敭鍊1,涓婚敭鍊2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 涓婚敭鍊笺佷富閿奸泦鍚堛佸疄浣撱佸疄浣撻泦鍚堛佸尶鍚嶅璞°佸尶鍚嶅璞¢泦鍚 - - - - - 寮鍚簨鍔★紙涓嶆敮鎸佸紓姝ワ級 - v1.5.0 鍏抽棴浜嗙嚎绋嬩簨鍔¤秴鏃惰嚜鍔ㄦ彁浜ょ殑鏈哄埗 - - 浜嬪姟浣 () => {} - - - - 寮鍚簨鍔★紙涓嶆敮鎸佸紓姝ワ級 - v1.5.0 鍏抽棴浜嗙嚎绋嬩簨鍔¤秴鏃惰嚜鍔ㄦ彁浜ょ殑鏈哄埗 - - - 浜嬪姟浣 () => {} - - - - 鏁版嵁搴撹闂璞 - - - - - 鎵鏈夋嫤鎴柟娉曢兘鍦ㄨ繖閲 - - - - - CodeFirst 妯″紡寮鍙戠浉鍏虫柟娉 - - - - - DbFirst 妯″紡寮鍙戠浉鍏虫柟娉 - - - - - 鍏ㄥ眬杩囨护璁剧疆锛屽彲榛樿闄勫姞涓 Select/Update/Delete 鏉′欢 - - - diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLCodeFirst.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLCodeFirst.cs index 5ade2766..bff35665 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLCodeFirst.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLCodeFirst.cs @@ -84,14 +84,9 @@ namespace FreeSql.Custom.PostgreSQL var sb = new StringBuilder(); var seqcols = new List>(); //搴忓垪 - var isPg95 = true; - var isPg96 = true; var isPg10 = (_orm.DbFirst as CustomPostgreSQLDbFirst).IsPg10; - using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) - { - isPg95 = CustomPostgreSQLDbFirst.ParsePgVersion(conn.Value.ServerVersion, 9, 5).Item1; - isPg96 = CustomPostgreSQLDbFirst.ParsePgVersion(conn.Value.ServerVersion, 9, 6).Item1; - } + var isPg95 = (_orm.DbFirst as CustomPostgreSQLDbFirst).IsPg95; + var isPg96 = (_orm.DbFirst as CustomPostgreSQLDbFirst).IsPg96; foreach (var obj in objects) { diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLDbFirst.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLDbFirst.cs index 56c6a659..1b560f7c 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLDbFirst.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLDbFirst.cs @@ -23,6 +23,8 @@ namespace FreeSql.Custom.PostgreSQL } public bool IsPg10 => ServerVersion >= 10; + public bool IsPg95 { get; private set; } + public bool IsPg96 { get; private set; } public int ServerVersion { get @@ -33,6 +35,8 @@ namespace FreeSql.Custom.PostgreSQL try { _ServerVersionValue = ParsePgVersion(conn.Value.ServerVersion, 10, 0).Item2; + IsPg95 = ParsePgVersion(conn.Value.ServerVersion, 9, 5).Item1; + IsPg96 = ParsePgVersion(conn.Value.ServerVersion, 9, 6).Item1; } catch { diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESCodeFirst.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESCodeFirst.cs index a6a0b7ea..2f9ced71 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESCodeFirst.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESCodeFirst.cs @@ -247,8 +247,9 @@ t.typname, case when a.atttypmod > 0 and a.atttypmod < 32767 then a.atttypmod - 4 else a.attlen end len, case when t.typelem > 0 and t.typinput::varchar = 'ARRAY_IN' then t2.typname else t.typname end, case when a.attnotnull then '0' else '1' end as is_nullable, ---e.adsrc, -(select {pg_}get_expr(adbin, adrelid) from {pg_}attrdef where adrelid = e.adrelid limit 1) is_identity, +--e.adsrc as is_identity, pg12浠ヤ笅 +--case when a.attidentity = 'd' the(select {pg_}get_expr(adbin, adrelid) from {pg_}attrdef where adrelid = e.adrelid limit 1) is_identity, pg10浠ヤ笅 +case when a.attidentity = 'd' then '1' else '0' end is_identity, a.attndims, d.description as comment from {pg_}class c @@ -284,7 +285,8 @@ where ns.nspname = {{0}} and c.relname = {{1}}", tboldname ?? tbname); sqlType = string.Concat(sqlType), max_length = long.Parse(string.Concat(a[2])), is_nullable = string.Concat(a[4]) == "1", - is_identity = string.Concat(a[5]).StartsWith(@"NEXTVAL('") && (string.Concat(a[5]).EndsWith(@"'::REGCLASS)") || string.Concat(a[5]).EndsWith(@"')")), + is_identity = string.Concat(a[5]) == "1", //pg10+ + //is_identity = string.Concat(a[5]).StartsWith(@"NEXTVAL('") && (string.Concat(a[5]).EndsWith(@"'::REGCLASS)") || string.Concat(a[5]).EndsWith(@"')")), attndims, comment = string.Concat(a[7]) }; diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESDbFirst.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESDbFirst.cs index 20f0a437..8f9a8f50 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESDbFirst.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESDbFirst.cs @@ -355,7 +355,8 @@ case when a.atttypmod > 0 and a.atttypmod < 32767 then a.atttypmod - 4 else a.at case when t.typelem = 0 then t.typname else t2.typname end, case when a.attnotnull then 0 else 1 end as is_nullable, --e.adsrc as is_identity, pg12浠ヤ笅 -(select {pg_}get_expr(adbin, adrelid) from {pg_}attrdef where adrelid = e.adrelid and adnum = e.adnum limit 1) is_identity, +--(select {pg_}get_expr(adbin, adrelid) from {pg_}attrdef where adrelid = e.adrelid and adnum = e.adnum limit 1) is_identity, pg10浠ヤ笅 +case when a.attidentity = 'd' then '1' else '0' end is_identity, d.description as comment, a.attndims, case when t.typelem = 0 then t.typtype else t2.typtype end, @@ -381,7 +382,8 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || c.relname") var max_length = int.Parse(string.Concat(row[3])); var sqlType = string.Concat(row[4]); var is_nullable = string.Concat(row[5]) == "1"; - var is_identity = string.Concat(row[6]).StartsWith(@"NEXTVAL('") && (string.Concat(row[6]).EndsWith(@"'::REGCLASS)") || string.Concat(row[6]).EndsWith(@"')")); + var is_identity = string.Concat(row[6]) == "1"; //pg10+ + //var is_identity = string.Concat(row[6]).StartsWith(@"NEXTVAL('") && (string.Concat(row[6]).EndsWith(@"'::REGCLASS)") || string.Concat(row[6]).EndsWith(@"')")); var comment = string.Concat(row[7]); var defaultValue = string.Concat(row[6]); int attndims = int.Parse(string.Concat(row[8])); @@ -635,5 +637,24 @@ where a.typtype = 'e' and ns.nspname in (SELECT schema_name FROM information_sch } return ret.Select(a => new DbEnumInfo { Name = a.Key, Labels = a.Value }).ToList(); } + + public static NativeTuple ParsePgVersion(string versionString, int v1, int v2) + { + int[] version = new int[] { 0, 0 }; + var vmatch = Regex.Match(versionString, @"(\d+)\.(\d+)"); + if (vmatch.Success) + { + version[0] = int.Parse(vmatch.Groups[1].Value); + version[1] = int.Parse(vmatch.Groups[2].Value); + } + else + { + vmatch = Regex.Match(versionString, @"(\d+)"); + version[0] = int.Parse(vmatch.Groups[1].Value); + } + if (version[0] > v1) return NativeTuple.Create(true, version[0], version[1]); + if (version[0] == v1 && version[1] >= v2) return NativeTuple.Create(true, version[0], version[1]); + return NativeTuple.Create(false, version[0], version[1]); + } } } \ No newline at end of file diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLCodeFirst.cs index 15cc0750..07ab82e9 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLCodeFirst.cs @@ -85,14 +85,9 @@ namespace FreeSql.Odbc.PostgreSQL var sb = new StringBuilder(); var seqcols = new List>(); //搴忓垪 - var isPg95 = true; - var isPg96 = true; var isPg10 = (_orm.DbFirst as OdbcPostgreSQLDbFirst).IsPg10; - using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) - { - isPg95 = OdbcPostgreSQLDbFirst.ParsePgVersion(conn.Value.ServerVersion, 9, 5).Item1; - isPg96 = OdbcPostgreSQLDbFirst.ParsePgVersion(conn.Value.ServerVersion, 9, 6).Item1; - } + var isPg95 = (_orm.DbFirst as OdbcPostgreSQLDbFirst).IsPg95; + var isPg96 = (_orm.DbFirst as OdbcPostgreSQLDbFirst).IsPg96; foreach (var obj in objects) { diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs index be5099ff..4ce00473 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs @@ -23,7 +23,10 @@ namespace FreeSql.Odbc.PostgreSQL _commonExpression = commonExpression; } + public bool IsPg10 => ServerVersion >= 10; + public bool IsPg95 { get; private set; } + public bool IsPg96 { get; private set; } public int ServerVersion { get @@ -34,6 +37,8 @@ namespace FreeSql.Odbc.PostgreSQL try { _ServerVersionValue = ParsePgVersion(conn.Value.ServerVersion, 10, 0).Item2; + IsPg95 = ParsePgVersion(conn.Value.ServerVersion, 9, 5).Item1; + IsPg96 = ParsePgVersion(conn.Value.ServerVersion, 9, 6).Item1; } catch { diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs index 8d619b15..ba269439 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs @@ -140,14 +140,9 @@ namespace FreeSql.PostgreSQL var sb = new StringBuilder(); var seqcols = new List>(); //搴忓垪 - var isPg95 = true; - var isPg96 = true; var isPg10 = (_orm.DbFirst as PostgreSQLDbFirst).IsPg10; - using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) - { - isPg95 = PostgreSQLDbFirst.ParsePgVersion(conn.Value.ServerVersion, 9, 5).Item1; - isPg96 = PostgreSQLDbFirst.ParsePgVersion(conn.Value.ServerVersion, 9, 6).Item1; - } + var isPg95 = (_orm.DbFirst as PostgreSQLDbFirst).IsPg95; + var isPg96 = (_orm.DbFirst as PostgreSQLDbFirst).IsPg96; foreach (var obj in objects) { diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs index 61d5d88f..d2782db9 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs @@ -29,6 +29,8 @@ namespace FreeSql.PostgreSQL } public bool IsPg10 => ServerVersion >= 10; + public bool IsPg95 { get; private set; } + public bool IsPg96 { get; private set; } public int ServerVersion { get @@ -39,6 +41,8 @@ namespace FreeSql.PostgreSQL try { _ServerVersionValue = ParsePgVersion(conn.Value.ServerVersion, 10, 0).Item2; + IsPg95 = ParsePgVersion(conn.Value.ServerVersion, 9, 5).Item1; + IsPg96 = ParsePgVersion(conn.Value.ServerVersion, 9, 6).Item1; } catch {