From 5260c856a333832149577b965891eec368b7fcc7 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 22 Nov 2023 20:14:01 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20IAsTable=20=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=88=86=E8=A1=A8=E6=94=AF=E6=8C=81=E4=B8=8D=E8=A7=84?= =?UTF-8?q?=E5=88=99=E6=97=B6=E9=97=B4=E9=97=B4=E9=9A=94=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 267 ++++++++++------------ FreeSql/DataAnnotations/TableAttribute.cs | 22 +- FreeSql/FreeSql.xml | 98 ++++++++ 3 files changed, 227 insertions(+), 160 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 3ce4b208..5b8532ae 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -109,7 +109,7 @@ namespace base_entity public B B { get; set; } } - [Table(Name = "as_table_log_{yyyyMMddHH}", AsTable = "createtime=2022-1-1 11(1 month)")] + [Table(Name = "as_table_log_{yyyyMMddHH}", AsTable = "createtime=2022-1-1 11(12,1 month)")] class AsTableLog { public Guid id { get; set; } @@ -589,7 +589,7 @@ namespace base_entity //.UseConnectionString(DataType.ClickHouse, "DataCompress=False;BufferSize=32768;SocketTimeout=10000;CheckCompressedHash=False;Encrypt=False;Compressor=lz4;Host=192.168.0.121;Port=8125;Database=PersonnelLocation;Username=root;Password=123") .UseMonitorCommand(cmd => { - //Console.WriteLine(cmd.CommandText + "\r\n"); + Console.WriteLine(cmd.CommandText + "\r\n"); //cmd.CommandText = null; //不执行 //if (cmd.CommandText.StartsWith("")) @@ -599,43 +599,122 @@ namespace base_entity .Build(); BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion - fsql.Select().First(); - var running = true; - for (var a = 0; a < 100; a++) - { - new Thread(() => - { - while (running) - { - try - { - fsql.Select().First(); - } - catch(Exception ex) - { - Console.WriteLine(ex.Message); - } - Task.Run(async () => - { - try - { - await fsql.Select().FirstAsync(); - } - catch (Exception ex) - { - Console.WriteLine("Async:" + ex.Message); - } - }); - } - }).Start(); - } - Console.ReadKey(); - running = false; - fsql.Dispose(); - return; + fsql.Select().Where(a => a.createtime > DateTime.Now && a.createtime < DateTime.Now.AddMonths(1)).ToList(); + //var table = fsql.CodeFirst.GetTableByEntity(typeof(AsTableLog)); + //table.SetAsTable(new ModAsTableImpl(fsql), table.ColumnsByCs[nameof(AsTableLog.click)]); - var x01sql01 = fsql.Select() + var testitems = new[] + { + new AsTableLog{ msg = "msg01", createtime = DateTime.Parse("2022-1-1 13:00:11"), click = 1 }, + new AsTableLog{ msg = "msg02", createtime = DateTime.Parse("2022-1-2 14:00:12"), click = 2 }, + new AsTableLog{ msg = "msg03", createtime = DateTime.Parse("2022-2-2 15:00:13"), click = 3 }, + new AsTableLog{ msg = "msg04", createtime = DateTime.Parse("2022-2-8 15:00:13"), click = 4 }, + new AsTableLog{ msg = "msg05", createtime = DateTime.Parse("2022-3-8 15:00:13"), click = 5 }, + new AsTableLog{ msg = "msg06", createtime = DateTime.Parse("2022-4-8 15:00:13"), click = 6 }, + new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-6-8 15:00:13"), click = 7 }, + new AsTableLog{ msg = "msg08", createtime = DateTime.Parse("2022-7-1"), click = 9}, + new AsTableLog{ msg = "msg09", createtime = DateTime.Parse("2022-7-1 11:00:00"), click = 10}, + new AsTableLog{ msg = "msg10", createtime = DateTime.Parse("2022-7-1 12:00:00"), click = 10} + }; + var sqlatb = fsql.Insert(testitems).NoneParameter(); + var sqlat = sqlatb.ToSql(); + var sqlatr = sqlatb.ExecuteAffrows(); + + //var sqlatc1 = fsql.Delete().Where(a => a.click < 0); + //var sqlatca1 = sqlatc1.ToSql(); + //var sqlatcr1 = sqlatc1.ExecuteAffrows(); + + var sqlatc1 = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime == DateTime.Parse("2022-3-8 15:00:13")); + var sqlatca1 = sqlatc1.ToSql(); + var sqlatcr1 = sqlatc1.ExecuteAffrows(); + + var sqlatc2 = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime == DateTime.Parse("2021-3-8 15:00:13")); + var sqlatca2 = sqlatc2.ToSql(); + var sqlatcr2 = sqlatc2.ExecuteAffrows(); + + var sqlatc = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); + var sqlatca = sqlatc.ToSql(); + var sqlatcr = sqlatc.ExecuteAffrows(); + + var sqlatd1 = fsql.Update().SetSource(testitems[0]); + var sqlatd101 = sqlatd1.ToSql(); + var sqlatd102 = sqlatd1.ExecuteAffrows(); + + var sqlatd2 = fsql.Update().SetSource(testitems[5]); + var sqlatd201 = sqlatd2.ToSql(); + var sqlatd202 = sqlatd2.ExecuteAffrows(); + + var sqlatd3 = fsql.Update().SetSource(testitems); + var sqlatd301 = sqlatd3.ToSql(); + var sqlatd302 = sqlatd3.ExecuteAffrows(); + + var sqlatd4 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg"); + var sqlatd401 = sqlatd4.ToSql(); + var sqlatd402 = sqlatd4.ExecuteAffrows(); + + var sqlatd5 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); + var sqlatd501 = sqlatd5.ToSql(); + var sqlatd502 = sqlatd5.ExecuteAffrows(); + + var sqlatd6 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime > DateTime.Parse("2022-3-1") && a.createtime < DateTime.Parse("2022-5-1")); + var sqlatd601 = sqlatd6.ToSql(); + var sqlatd602 = sqlatd6.ExecuteAffrows(); + + var sqlatd7 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime > DateTime.Parse("2022-3-1")); + var sqlatd701 = sqlatd7.ToSql(); + var sqlatd702 = sqlatd7.ExecuteAffrows(); + + var sqlatd8 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime < DateTime.Parse("2022-5-1")); + var sqlatd801 = sqlatd8.ToSql(); + var sqlatd802 = sqlatd8.ExecuteAffrows(); + + var sqlatd12 = fsql.InsertOrUpdate().SetSource(testitems[0]); + var sqlatd1201 = sqlatd12.ToSql(); + var sqlatd1202 = sqlatd12.ExecuteAffrows(); + + var sqlatd22 = fsql.InsertOrUpdate().SetSource(testitems[5]); + var sqlatd2201 = sqlatd22.ToSql(); + var sqlatd2202 = sqlatd22.ExecuteAffrows(); + + var sqlatd32 = fsql.InsertOrUpdate().SetSource(testitems); + var sqlatd3201 = sqlatd32.ToSql(); + var sqlatd3202 = sqlatd32.ExecuteAffrows(); + + var sqls1 = fsql.Select().OrderBy(a => a.createtime).Limit(10); + var sqls101 = sqls1.ToSql(); + var sqls102 = sqls1.ToList(); + + var sqls2 = fsql.Select().Where(a => a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); + var sqls201 = sqls2.ToSql(); + var sqls202 = sqls2.ToList(); + + var sqls3 = fsql.Select().Where(a => a.createtime > DateTime.Parse("2022-3-1") && a.createtime < DateTime.Parse("2022-5-1")); + var sqls301 = sqls3.ToSql(); + var sqls302 = sqls3.ToList(); + + var sqls4 = fsql.Select().Where(a => a.createtime > DateTime.Parse("2022-3-1")); + var sqls401 = sqls4.ToSql(); + var sqls402 = sqls4.ToList(); + + var sqls5 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")); + var sqls501 = sqls5.ToSql(); + var sqls502 = sqls5.ToList(); + + var sqls6 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")).Limit(10).OrderBy(a => a.createtime); + var sqls601 = sqls6.ToSql(); + var sqls602 = sqls6.ToList(); + + var sqls7 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")).ToAggregate(g => new + { + sum1 = g.Sum(g.Key.click), + cou1 = g.Count(), + avg1 = g.Avg(g.Key.click), + min = g.Min(g.Key.click), + max = g.Max(g.Key.click) + }); + + var x01sql01 = fsql.Select() .Include(a => a.Test1) .Include(a => a.Test2) .Include(a => a.Test3) @@ -763,7 +842,6 @@ namespace base_entity title = "one plus pro" }.Save(); - fsql.Select().Where(a => a.createtime > DateTime.Now && a.createtime < DateTime.Now.AddMonths(1)).ToList(); using (var uow = fsql.CreateUnitOfWork()) { @@ -914,118 +992,7 @@ namespace base_entity .ToSql(); - //var table = fsql.CodeFirst.GetTableByEntity(typeof(AsTableLog)); - //table.SetAsTable(new ModAsTableImpl(fsql), table.ColumnsByCs[nameof(AsTableLog.click)]); - - var testitems = new[] - { - new AsTableLog{ msg = "msg01", createtime = DateTime.Parse("2022-1-1 13:00:11"), click = 1 }, - new AsTableLog{ msg = "msg02", createtime = DateTime.Parse("2022-1-2 14:00:12"), click = 2 }, - new AsTableLog{ msg = "msg03", createtime = DateTime.Parse("2022-2-2 15:00:13"), click = 3 }, - new AsTableLog{ msg = "msg04", createtime = DateTime.Parse("2022-2-8 15:00:13"), click = 4 }, - new AsTableLog{ msg = "msg05", createtime = DateTime.Parse("2022-3-8 15:00:13"), click = 5 }, - new AsTableLog{ msg = "msg06", createtime = DateTime.Parse("2022-4-8 15:00:13"), click = 6 }, - new AsTableLog{ msg = "msg07", createtime = DateTime.Parse("2022-6-8 15:00:13"), click = 7 }, - new AsTableLog{ msg = "msg08", createtime = DateTime.Parse("2022-7-1"), click = 9}, - new AsTableLog{ msg = "msg09", createtime = DateTime.Parse("2022-7-1 11:00:00"), click = 10}, - new AsTableLog{ msg = "msg10", createtime = DateTime.Parse("2022-7-1 12:00:00"), click = 10} - }; - var sqlatb = fsql.Insert(testitems).NoneParameter(); - var sqlat = sqlatb.ToSql(); - var sqlatr = sqlatb.ExecuteAffrows(); - - //var sqlatc1 = fsql.Delete().Where(a => a.click < 0); - //var sqlatca1 = sqlatc1.ToSql(); - //var sqlatcr1 = sqlatc1.ExecuteAffrows(); - - var sqlatc1 = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime == DateTime.Parse("2022-3-8 15:00:13")); - var sqlatca1 = sqlatc1.ToSql(); - var sqlatcr1 = sqlatc1.ExecuteAffrows(); - - var sqlatc2 = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime == DateTime.Parse("2021-3-8 15:00:13")); - var sqlatca2 = sqlatc2.ToSql(); - var sqlatcr2 = sqlatc2.ExecuteAffrows(); - - var sqlatc = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); - var sqlatca = sqlatc.ToSql(); - var sqlatcr = sqlatc.ExecuteAffrows(); - - var sqlatd1 = fsql.Update().SetSource(testitems[0]); - var sqlatd101 = sqlatd1.ToSql(); - var sqlatd102 = sqlatd1.ExecuteAffrows(); - - var sqlatd2 = fsql.Update().SetSource(testitems[5]); - var sqlatd201 = sqlatd2.ToSql(); - var sqlatd202 = sqlatd2.ExecuteAffrows(); - - var sqlatd3 = fsql.Update().SetSource(testitems); - var sqlatd301 = sqlatd3.ToSql(); - var sqlatd302 = sqlatd3.ExecuteAffrows(); - - var sqlatd4 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg"); - var sqlatd401 = sqlatd4.ToSql(); - var sqlatd402 = sqlatd4.ExecuteAffrows(); - - var sqlatd5 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); - var sqlatd501 = sqlatd5.ToSql(); - var sqlatd502 = sqlatd5.ExecuteAffrows(); - - var sqlatd6 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime > DateTime.Parse("2022-3-1") && a.createtime < DateTime.Parse("2022-5-1")); - var sqlatd601 = sqlatd6.ToSql(); - var sqlatd602 = sqlatd6.ExecuteAffrows(); - - var sqlatd7 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime > DateTime.Parse("2022-3-1")); - var sqlatd701 = sqlatd7.ToSql(); - var sqlatd702 = sqlatd7.ExecuteAffrows(); - - var sqlatd8 = fsql.Update(Guid.NewGuid()).Set(a => a.msg == "newmsg").Where(a => a.createtime < DateTime.Parse("2022-5-1")); - var sqlatd801 = sqlatd8.ToSql(); - var sqlatd802 = sqlatd8.ExecuteAffrows(); - - var sqlatd12 = fsql.InsertOrUpdate().SetSource(testitems[0]); - var sqlatd1201 = sqlatd12.ToSql(); - var sqlatd1202 = sqlatd12.ExecuteAffrows(); - - var sqlatd22 = fsql.InsertOrUpdate().SetSource(testitems[5]); - var sqlatd2201 = sqlatd22.ToSql(); - var sqlatd2202 = sqlatd22.ExecuteAffrows(); - - var sqlatd32 = fsql.InsertOrUpdate().SetSource(testitems); - var sqlatd3201 = sqlatd32.ToSql(); - var sqlatd3202 = sqlatd32.ExecuteAffrows(); - - var sqls1 = fsql.Select().OrderBy(a => a.createtime); - var sqls101 = sqls1.ToSql(); - var sqls102 = sqls1.ToList(); - - var sqls2 = fsql.Select().Where(a => a.createtime.Between(DateTime.Parse("2022-3-1"), DateTime.Parse("2022-5-1"))); - var sqls201 = sqls2.ToSql(); - var sqls202 = sqls2.ToList(); - - var sqls3 = fsql.Select().Where(a => a.createtime > DateTime.Parse("2022-3-1") && a.createtime < DateTime.Parse("2022-5-1")); - var sqls301 = sqls3.ToSql(); - var sqls302 = sqls3.ToList(); - - var sqls4 = fsql.Select().Where(a => a.createtime > DateTime.Parse("2022-3-1")); - var sqls401 = sqls4.ToSql(); - var sqls402 = sqls4.ToList(); - - var sqls5 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")); - var sqls501 = sqls5.ToSql(); - var sqls502 = sqls5.ToList(); - - var sqls6 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")).Limit(10).OrderBy(a => a.createtime); - var sqls601 = sqls6.ToSql(); - var sqls602 = sqls6.ToList(); - - var sqls7 = fsql.Select().Where(a => a.createtime < DateTime.Parse("2022-5-1")).ToAggregate(g => new - { - sum1 = g.Sum(g.Key.click), - cou1 = g.Count(), - avg1 = g.Avg(g.Key.click), - min = g.Min(g.Key.click), - max = g.Max(g.Key.click) - }); + var iouSetSql01 = fsql.InsertOrUpdate() diff --git a/FreeSql/DataAnnotations/TableAttribute.cs b/FreeSql/DataAnnotations/TableAttribute.cs index 5f668e90..cb2f5f74 100644 --- a/FreeSql/DataAnnotations/TableAttribute.cs +++ b/FreeSql/DataAnnotations/TableAttribute.cs @@ -45,7 +45,7 @@ namespace FreeSql.DataAnnotations { if (string.IsNullOrEmpty(AsTable) == false) { - var atm = Regex.Match(AsTable, @"([\w_\d]+)\s*=\s*(\d\d\d\d)\s*\-\s*(\d\d?)\s*\-\s*(\d\d?)\s*( [\d:]+)?\((\d+)\s*(year|month|day|hour)\)", RegexOptions.IgnoreCase); + var atm = Regex.Match(AsTable, @"([\w_\d]+)\s*=\s*(\d\d\d\d)\s*\-\s*(\d\d?)\s*\-\s*(\d\d?)\s*( [\d:]+)?\(([\d,]+)\s*(year|month|day|hour)\)", RegexOptions.IgnoreCase); if (atm.Success == false) throw new Exception(CoreStrings.AsTable_PropertyName_FormatError(AsTable)); @@ -65,11 +65,12 @@ namespace FreeSql.DataAnnotations else if (hhmmss.Length == 2) beginTime = $"{beginTime} {hhmmss[0]}:{hhmmss[1]}:0"; else if (hhmmss.Length == 3) beginTime = $"{beginTime} {hhmmss[0]}:{hhmmss[1]}:{hhmmss[2]}"; } - int.TryParse(atm.Groups[6].Value, out var atm6); + var intervals = atm.Groups[6].Value.Split(',').Select(a => int.TryParse(a, out var atm6) ? atm6 : 0).Where(a => a > 0).ToArray(); string atm7 = atm.Groups[7].Value.ToLower(); - tb.AsTableImpl = new DateTimeAsTableImpl(Name, DateTime.Parse(beginTime), dt => + tb.AsTableImpl = new DateTimeAsTableImpl(Name, DateTime.Parse(beginTime), (dt, idx) => { - switch (atm7) + var atm6 = idx >= 0 && idx < intervals.Length ? intervals[idx] : intervals.Last(); + switch (atm7) { case "year": return dt.AddYears(atm6); case "month": return dt.AddMonths(atm6); @@ -89,19 +90,19 @@ namespace FreeSql.DataAnnotations string[] GetTableNamesByColumnValueRange(object columnValue1, object columnValue2); string[] GetTableNamesBySqlWhere(string sqlWhere, List dbParams, SelectTableInfo tb, CommonUtils commonUtils); } - class DateTimeAsTableImpl : IAsTable + class DateTimeAsTableImpl : IAsTable { readonly object _lock = new object(); readonly List _allTables = new List(); readonly List _allTablesTime = new List(); readonly DateTime _beginTime; DateTime _lastTime; - Func _nextTimeFunc; + Func _nextTimeFunc; string _tableName; Match _tableNameFormat; static Regex _regTableNameFormat = new Regex(@"\{([^\\}]+)\}"); - public DateTimeAsTableImpl(string tableName, DateTime beginTime, Func nextTimeFunc) + public DateTimeAsTableImpl(string tableName, DateTime beginTime, Func nextTimeFunc) { if (nextTimeFunc == null) throw new ArgumentException(CoreStrings.Cannot_Be_NULL_Name("nextTimeFunc")); //beginTime = beginTime.Date; //日期部分作为开始 @@ -116,7 +117,8 @@ namespace FreeSql.DataAnnotations int GetTimestamp(DateTime dt) => (int)dt.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; void ExpandTable(DateTime beginTime, DateTime endTime) { - if (beginTime > endTime) endTime = _nextTimeFunc(beginTime); + var index = 0; + if (beginTime > endTime) endTime = _nextTimeFunc(beginTime, -1); lock (_lock) { while (beginTime <= endTime) @@ -127,7 +129,7 @@ namespace FreeSql.DataAnnotations _allTables.Insert(0, name); _allTablesTime.Insert(0, beginTime); _lastTime = beginTime; - beginTime = _nextTimeFunc(beginTime); + beginTime = _nextTimeFunc(beginTime, index++); } } } @@ -153,7 +155,7 @@ namespace FreeSql.DataAnnotations { var dt = ParseColumnValue(columnValue); if (dt < _beginTime) throw new Exception(CoreStrings.SubTableFieldValue_CannotLessThen(dt.ToString("yyyy-MM-dd HH:mm:ss"), _beginTime.ToString("yyyy-MM-dd HH:mm:ss"))); - var tmpTime = _nextTimeFunc(_lastTime); + var tmpTime = _nextTimeFunc(_lastTime, -1); if (dt >= tmpTime && autoExpand) { // 自动建表 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index ea78dcc5..f4a66a58 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1086,6 +1086,82 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5769,6 +5845,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and