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;