From 2a2be549868c8197224986fb6b183f92e4a4a99f Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 26 Jan 2024 19:33:49 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20Enum=20->=20MapType(st?= =?UTF-8?q?ring)=20+=20GroupBy=20=E8=A7=A3=E6=9E=90=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9B#1727?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 -- FreeSql.Tests/FreeSql.Tests/Issues/1237.cs | 4 +- FreeSql/FreeSql.xml | 112 ------------------ FreeSql/Internal/CommonExpression.cs | 5 +- .../SelectProvider/Select0Provider.cs | 4 + .../SelectProvider/SelectGroupingProvider.cs | 15 +-- .../Internal/Model/ReadAnonymousTypeInfo.cs | 6 + 7 files changed, 20 insertions(+), 135 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 341e3d36..1567ec63 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -806,14 +806,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/1237.cs b/FreeSql.Tests/FreeSql.Tests/Issues/1237.cs index a18e6437..f7cf660d 100644 --- a/FreeSql.Tests/FreeSql.Tests/Issues/1237.cs +++ b/FreeSql.Tests/FreeSql.Tests/Issues/1237.cs @@ -36,11 +36,11 @@ ORDER BY b.""Name"", b.""ID""", people1); .ToSql(); Assert.Equal(@"SELECT * FROM ( - SELECT replace(replace(a.""Name"", ' ', ''), ' ', '') ""xm_new"", a.""CSNY"" ""csny"" + SELECT replace(replace(a.""Name"", ' ', ''), ' ', '') ""xm"", a.""CSNY"" ""csny"" FROM ""people_issues_1237"" a GROUP BY replace(replace(a.""Name"", ' ', ''), ' ', ''), a.""CSNY"" HAVING (count(1) > 1) ) a -INNER JOIN ""people_issues_1237"" b ON a.""xm_new"" = replace(replace(b.""Name"", ' ', ''), ' ', '') AND a.""csny"" = b.""CSNY"" +INNER JOIN ""people_issues_1237"" b ON a.""xm"" = replace(replace(b.""Name"", ' ', ''), ' ', '') AND a.""csny"" = b.""CSNY"" ORDER BY b.""Name"", b.""ID""", people2); } diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 489e88dd..8adf6d85 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -6337,115 +6337,3 @@ -`0})"> - - 插入数据,传入实体集合 - - - - - - - - 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: - 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 - 人大金仓:on conflict do update - 神通:merge into - MsAccess:不支持 - 注意区别:FreeSql.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/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index a96230f0..af4160fc 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -26,6 +26,7 @@ namespace FreeSql.Internal public ReadAnonymousTypeInfo _map; public string _field; public ReadAnonymousTypeInfo ParseExpMapResult { get; internal protected set; } + public ColumnInfo ParseExpColumnResult { get; internal protected set; } public abstract string ParseExp(Expression[] members); } @@ -859,10 +860,10 @@ namespace FreeSql.Internal } Type oldMapType = null; - if (tsc.diymemexp != null) tsc.diymemexp.ParseExpMapResult = null; + if (tsc.diymemexp != null) tsc.diymemexp.ParseExpColumnResult = null; var left = ExpressionLambdaToSql(leftExp, tsc); var leftMapColumn = SearchColumnByField(tsc._tables, tsc.currentTable, left) ?? - (tsc.diymemexp?.ParseExpMapResult?.Table?.ColumnsByCs.TryGetValue(tsc.diymemexp.ParseExpMapResult.CsName, out var dmcol) == true ? dmcol : null); //group by emum -> MapType(string) #1727 + tsc.diymemexp?.ParseExpColumnResult; //group by emum -> MapType(string) #1727 var isLeftMapType = leftMapColumn != null && new[] { "AND", "OR", "*", "/", "+", "-" }.Contains(oper) == false && (leftMapColumn.Attribute.MapType != rightExp.Type || leftMapColumn.CsType != rightExp.Type); ColumnInfo rightMapColumn = null; var isRightMapType = false; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index f814035f..22a6a900 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -241,6 +241,7 @@ namespace FreeSql.Internal.CommonProvider public override string ParseExp(Expression[] members) { ParseExpMapResult = null; + ParseExpColumnResult = null; ParseExpMatchedTable = GetOutsideSelectTable(members.FirstOrDefault()?.GetParameter()); if (ParseExpMatchedTable == null) return null; @@ -254,12 +255,14 @@ namespace FreeSql.Internal.CommonProvider if (members.Any() == false) { ParseExpMapResult = insideData.InsideMap; + ParseExpColumnResult = ParseExpMapResult.GetColumn(); return $"{ParseExpMatchedTable.Alias}.{insideData.InsideMap.DbNestedField}"; } var read = insideData.InsideMap; if (members.Length == 1 && members[0] == ParseExpMatchedTable.Parameter) { ParseExpMapResult = read; + ParseExpColumnResult = ParseExpMapResult.GetColumn(); return $"{ParseExpMatchedTable.Alias}.{read.DbNestedField}"; } for (var a = members[0] == ParseExpMatchedTable.Parameter ? 1 : 0; a < members.Length; a++) @@ -268,6 +271,7 @@ namespace FreeSql.Internal.CommonProvider if (read == null) return null; } ParseExpMapResult = read; + ParseExpColumnResult = ParseExpMapResult.GetColumn(); return $"{ParseExpMatchedTable.Alias}.{read.DbNestedField}"; } public SelectTableInfo GetOutsideSelectTable(ParameterExpression parameterExp) diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index 2d78eda8..d20306cd 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -36,9 +36,11 @@ namespace FreeSql.Internal.CommonProvider public override string ParseExp(Expression[] members) { ParseExpMapResult = null; + ParseExpColumnResult = null; if (members.Any() == false) { ParseExpMapResult = _map; + ParseExpColumnResult = ParseExpMapResult.GetColumn(); return _map.DbField; } var firstMember = ((members.FirstOrDefault() as MemberExpression)?.Expression as MemberExpression); @@ -53,6 +55,7 @@ namespace FreeSql.Internal.CommonProvider if (read == null) return null; } ParseExpMapResult = read; + ParseExpColumnResult = ParseExpMapResult.GetColumn(); if (!_addFieldAlias) return read.DbField; if (_flagNestedFieldAlias) return read.DbField; if (_comonExp.EndsWithDbNestedField(read.DbField, read.DbNestedField) == false) @@ -82,6 +85,7 @@ namespace FreeSql.Internal.CommonProvider members[a] = replaceVistor.Modify(members[a], replaceMember, curtable.Parameter); var ret = _select._diymemexpWithTempQuery.ParseExp(members); ParseExpMapResult = _select._diymemexpWithTempQuery.ParseExpMapResult; + ParseExpColumnResult = ParseExpMapResult.GetColumn(); return ret; } } @@ -132,16 +136,7 @@ namespace FreeSql.Internal.CommonProvider } var tsc = new CommonExpression.ExpTSC { _tables = _tables, _tableRule = _select._tableRule, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = true, style = CommonExpression.ExpressionStyle.Where }; var result = _comonExp.ExpressionLambdaToSql(retExp, tsc); - //ParseExpMapResult = result - if (tsc.mapColumnTmp != null) - ParseExpMapResult = new ReadAnonymousTypeInfo - { - Property = tsc.mapColumnTmp.Table.Properties[tsc.mapColumnTmp.CsName], - CsName = tsc.mapColumnTmp.CsName, - CsType = tsc.mapColumnTmp.CsType, //dtoProp.PropertyType, - MapType = tsc.mapColumnTmp.Attribute.MapType, - Table = tsc.mapColumnTmp.Table - }; + ParseExpColumnResult = tsc.mapColumnTmp; return result; } return null; diff --git a/FreeSql/Internal/Model/ReadAnonymousTypeInfo.cs b/FreeSql/Internal/Model/ReadAnonymousTypeInfo.cs index 27c50960..22000068 100644 --- a/FreeSql/Internal/Model/ReadAnonymousTypeInfo.cs +++ b/FreeSql/Internal/Model/ReadAnonymousTypeInfo.cs @@ -25,6 +25,12 @@ namespace FreeSql.Internal.Model public string IncludeManyKey { get; set; } //ToList(a => new { a.Childs }) 集合属性指定加载 public Expression SubSelectMany { get; set; } //ToList(a => new { sublist = fsql.Select().ToList() }) 子集合查询 + public ColumnInfo GetColumn() + { + if (Childs.Any() == false && Table != null && CsName != null && Table.ColumnsByCs.TryGetValue(CsName, out var pcol)) return pcol; + return null; + } + public void CopyTo(ReadAnonymousTypeInfo target) { target.Property = Property;