From 7115b688716067a462669a0b9f9677c0e034679a Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 2 Nov 2023 10:30:13 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20RereadSql=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=A1=A8=E7=9A=84=E5=85=B6=E4=BB=96=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=EF=BC=9B#1655?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 41 ++++++++++++++++++++++ FreeSql/DataAnnotations/ColumnAttribute.cs | 1 + FreeSql/DataAnnotations/ColumnFluent.cs | 1 + FreeSql/FreeSql.xml | 2 ++ FreeSql/Internal/CommonUtils.cs | 13 ++++++- 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 4efbf7d9..07395125 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -600,6 +600,21 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + var x01sql01 = fsql.Select() + .Include(a => a.Test1) + .Include(a => a.Test2) + .Include(a => a.Test3) + .ToSql(); + + var txxx01 = fsql.Select() + .WhereDynamicFilter(new DynamicFilterInfo + { + Field = nameof(User1.CreateTime), + Operator = DynamicFilterOperator.DateRange, + Value = $"{DateTime.MinValue.ToString("yyyy-MM-dd")},{DateTime.MinValue.ToString("yyyy-MM-dd")}" + }) + .ToSql(); + var updatejoin031sql = fsql.Update() .Join(fsql.Select().Where(a => a.GroupName == "xxx"), (a, b) => a.GroupId == b.Id) .AsTable("t1", null) @@ -2950,4 +2965,30 @@ public class B11 public int Id { get; set; } public string Name { get; set; } public A11 a { get; set; } +} +public class Main1 +{ + public long Id { get; set; } + + public long Test1Id { get; set; } + + public long Test2Id { get; set; } + + public long Test3Id { get; set; } + + public virtual Test2 Test1 { get; set; } + + public virtual Test2 Test2 { get; set; } + + public virtual Test2 Test3 { get; set; } +} + +public class Test2 +{ + public long Id { get; set; } + + [Column(RereadSql = "IIF({IsEnabled} = 1, {0}, {0} + '-已停用')")] + public string ItemName { get; set; } + + public bool IsEnabled { get; set; } } \ No newline at end of file diff --git a/FreeSql/DataAnnotations/ColumnAttribute.cs b/FreeSql/DataAnnotations/ColumnAttribute.cs index 8ca27766..549b2b03 100644 --- a/FreeSql/DataAnnotations/ColumnAttribute.cs +++ b/FreeSql/DataAnnotations/ColumnAttribute.cs @@ -126,6 +126,7 @@ namespace FreeSql.DataAnnotations /// /// 重读功能 /// 比如:[Column(RereadSql = "{0}.STAsText()")] + /// 或者:[Column(RereadSql = "{geo}.STAsText()")] /// 查询:SELECT a.[id], a.[geo].STAsText() FROM [table] a /// public string RereadSql { get; set; } diff --git a/FreeSql/DataAnnotations/ColumnFluent.cs b/FreeSql/DataAnnotations/ColumnFluent.cs index 47de1150..fcc41545 100644 --- a/FreeSql/DataAnnotations/ColumnFluent.cs +++ b/FreeSql/DataAnnotations/ColumnFluent.cs @@ -206,6 +206,7 @@ namespace FreeSql.DataAnnotations /// /// 重读功能 /// 比如:[Column(RereadSql = "{0}.STAsText()")] + /// 或者:[Column(RereadSql = "{geo}.STAsText()")] /// 查询:SELECT a.[id], a.[geo].STAsText() FROM [table] a /// /// diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 7e96ab0a..ea78dcc5 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -127,6 +127,7 @@ 重读功能 比如:[Column(RereadSql = "{0}.STAsText()")] + 或者:[Column(RereadSql = "{geo}.STAsText()")] 查询:SELECT a.[id], a.[geo].STAsText() FROM [table] a @@ -260,6 +261,7 @@ 重读功能 比如:[Column(RereadSql = "{0}.STAsText()")] + 或者:[Column(RereadSql = "{geo}.STAsText()")] 查询:SELECT a.[id], a.[geo].STAsText() FROM [table] a diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index eb39d5cb..89fb22b2 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -75,7 +75,18 @@ namespace FreeSql.Internal { var result = QuoteReadColumnAdapter(col.CsType, col.Attribute.MapType, columnName); if (string.IsNullOrWhiteSpace(col?.Attribute.RereadSql) == false) - return string.Format(col.Attribute.RereadSql, result); + { + var tableAlias = columnName.Replace(QuoteSqlName(col.Attribute.Name), ""); + var rereadSql = Regex.Replace(col.Attribute.RereadSql, @"\{([_\w][_\w\d]+)\}", rm => + { + if (col.Table.ColumnsByCs.TryGetValue(rm.Groups[1].Value, out var trycol)) + return $"{tableAlias}{QuoteSqlName(trycol.Attribute.Name)}"; + else if (col.Table.Columns.TryGetValue(rm.Groups[1].Value, out trycol)) + return $"{tableAlias}{QuoteSqlName(trycol.Attribute.Name)}"; + return rm.Groups[0].Value; + }); + return string.Format(rereadSql, result); + } return result; } public virtual string FieldAsAlias(string alias) => $" {alias}";