From a157f8a0cc2693955e72f1d7b30e9d6d202a8225 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 15 Mar 2023 22:54:22 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20FromQueryMulti=20?= =?UTF-8?q?=E5=A4=9A=E8=A1=A8=E9=87=8D=E8=BD=BD=E5=8F=AF=E8=83=BD=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E7=9A=84=20null=20=E5=AF=B9=E8=B1=A1=E6=8A=A5?= =?UTF-8?q?=E9=94=99=EF=BC=9B(=E5=90=88=E5=B9=B6=20FromQuery=20=E5=92=8C?= =?UTF-8?q?=20FromQueryMulti=20=E4=BB=A3=E7=A0=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 +++ .../Curd/SqlServerSelectWithTempQueryTest.cs | 3 +- .../SelectProvider/Select1Provider.cs | 67 ++++--------------- .../Internal/CommonProvider/UpdateProvider.cs | 3 +- .../CustomSqlServerAdo/CustomSqlServerAdo.cs | 2 +- .../OdbcSqlServerAdo/OdbcSqlServerAdo.cs | 2 +- .../SqlServerAdo/SqlServerAdo.cs | 2 +- 7 files changed, 27 insertions(+), 61 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 537315e2..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs index 1503fd6d..06327185 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs @@ -78,7 +78,8 @@ WHERE (a.[RN] < 2)", sql); }); Assert.Equal(@"SELECT a.[CkassIfCation] as1, b.[DeliveryInstractionStatus] as2, b.[UpTime] as3, 1 as4, c.[RunNo] as5 FROM [UnitLog] a -INNER JOIN (SELECT a.[LoadNo], a.[SeqNoLog], c.[DeliveryInstractionStatus], c.[UpTime], row_number() over( partition by a.[UnitId] order by a.[SeqNoLog] desc) [RN] +INNER JOIN ( + SELECT a.[LoadNo], a.[SeqNoLog], c.[DeliveryInstractionStatus], c.[UpTime], row_number() over( partition by a.[UnitId] order by a.[SeqNoLog] desc) [RN] FROM [UnitLog] a INNER JOIN [LoadPlan] b ON a.[LoadNo] = b.[LoadNo] AND a.[UnitTransactionType] = N'TO' INNER JOIN [Instruction] c ON b.[InstructionNo] = c.[InstructionNo] ) b ON a.[SeqNoLog] = b.[SeqNoLog] diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index 1173fef2..bd5ae278 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -126,74 +126,31 @@ namespace FreeSql.Internal.CommonProvider public ISelect FromQuery(ISelect select2) where T2 : class { var ret = From(); - var retsp = ret as Select0Provider; - var rettbs = retsp._tables; - if (rettbs[1].Table == null) rettbs[1].Table = TableInfo.GetDefaultTable(typeof(T2)); - var select2sp = select2 as Select0Provider; - (_diymemexpWithTempQuery as WithTempQueryParser)?.Append(select2sp, rettbs[1]); - string sql2 = null; - if (select2sp._diymemexpWithTempQuery == null) - { - if (select2sp._tableRule == null && select2sp._tables[0].Table.Type == typeof(T2) && select2sp.IsDefaultSqlContent == true) - return ret; - sql2 = select2?.ToSql(a => a, FieldAliasOptions.AsProperty); - } - else - { - if (retsp._diymemexpWithTempQuery == null) - retsp._diymemexpWithTempQuery = new WithTempQueryParser(null, null, null, null).Append(select2sp, rettbs[1]); - if (select2sp._tableRule != null && select2sp.IsDefaultSqlContent == true) - { - sql2 = select2sp._tableRule(select2sp._tables[0].Table.Type, null); - if (sql2.StartsWith("(") && sql2.EndsWith(")")) sql2 = sql2.Substring(1, sql2.Length - 2); - if (sql2.StartsWith(" \r\n")) sql2 = sql2.Substring(3); - } - if (string.IsNullOrWhiteSpace(sql2)) - sql2 = select2?.ToSql("*"); - } - if (retsp._tableRules.Count > 0) - { - var tbrules = retsp._tableRules.ToList(); - retsp._tableRules.Clear(); - tbrules.ForEach(tbrule => - { - var tbruler1 = tbrule(typeof(T1), retsp._tables[0].Table.DbName); - if (string.IsNullOrWhiteSpace(tbruler1) == false) - retsp._tableRules.Add((type, old) => - { - if (type == typeof(T1)) return tbruler1; - if (type == typeof(T2)) return $"( \r\n{sql2})"; - - return old; - }); - }); - } - if (retsp._tableRules.Count == 0) ret.WithSql(null, $" \r\n{sql2}"); - return ret; + return FromQueryMulti(ret, new[] { typeof(T2) }, new[] { select2 as Select0Provider }); } public TQuery FromQueryMulti(TQuery ret, Type[] entityTypes, Select0Provider[] querys) { var retsp = ret as Select0Provider; var rettbs = retsp._tables; - var sql2List = new string[rettbs.Count - 1]; - for (var a = 1; a < rettbs.Count; a++) + var sql2List = new string[querys.Length]; + for (var a = 0; a < querys.Length; a++) { - var select2 = querys[a - 1]; - var entityType2 = entityTypes[a - 1]; - var rettb2 = rettbs[a]; + var select2 = querys[a]; + var entityType2 = entityTypes[a]; + var rettb2 = rettbs[a + 1]; if (rettb2.Table == null) rettb2.Table = TableInfo.GetDefaultTable(entityType2); - (_diymemexpWithTempQuery as WithTempQueryParser)?.Append(select2, rettb2); + (retsp._diymemexpWithTempQuery as WithTempQueryParser)?.Append(select2, rettb2); string sql2 = null; if (select2._diymemexpWithTempQuery == null) { if (select2._tableRule == null && select2._tables[0].Table.Type == entityType2 && select2.IsDefaultSqlContent == true) continue; - var selectorParameter = Expression.Parameter(entityType2); + var selectorParameter = Expression.Parameter(entityType2, select2._tables[0].Alias); var selector = Expression.Lambda(selectorParameter, selectorParameter); select2._tables[0].Parameter = selectorParameter; - var af = this.GetExpressionField(selector, FieldAliasOptions.AsProperty); - sql2 = this.ToSql(af.field); + var af = select2.GetExpressionField(selector, FieldAliasOptions.AsProperty); + sql2 = select2.ToSqlBase(af.field); } else { @@ -208,7 +165,7 @@ namespace FreeSql.Internal.CommonProvider if (string.IsNullOrWhiteSpace(sql2)) sql2 = select2.ToSqlBase("*"); } - sql2List[a - 1] = sql2; + sql2List[a] = sql2; } if (retsp._tableRules.Count > 0) { @@ -232,7 +189,7 @@ namespace FreeSql.Internal.CommonProvider retsp.AsTableBase((type, old) => { for (var a = 0; a < entityTypes.Length; a++) - if (entityTypes[a] == type) return string.IsNullOrWhiteSpace(sql2List[a]) ? old : $"({sql2List[a]})"; + if (entityTypes[a] == type) return string.IsNullOrWhiteSpace(sql2List[a]) ? old : $"( \r\n{sql2List[a]})"; return old; }); } diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 8449a6b4..300459fe 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -622,8 +622,7 @@ namespace FreeSql.Internal.CommonProvider Attribute = new DataAnnotations.ColumnAttribute { Name = colName, - MapType = colType, - DbType = "", //for SqlServer: ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) + MapType = colType }, CsType = colType }; diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs index e4a724b6..61e61caa 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs @@ -39,7 +39,7 @@ namespace FreeSql.Custom.SqlServer return (bool)param ? 1 : 0; else if (param is string) { - if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false) + if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && !string.IsNullOrWhiteSpace(mapColumn.Attribute.DbType) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false) return string.Concat("'", param.ToString().Replace("'", "''"), "'"); return string.Concat("N'", param.ToString().Replace("'", "''"), "'"); } diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs index fc4b1f5f..03a9e204 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs @@ -47,7 +47,7 @@ namespace FreeSql.Odbc.SqlServer return (bool)param ? 1 : 0; else if (param is string) { - if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false) + if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && !string.IsNullOrWhiteSpace(mapColumn.Attribute.DbType) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false) return string.Concat("'", param.ToString().Replace("'", "''"), "'"); return string.Concat("N'", param.ToString().Replace("'", "''"), "'"); } diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs index e794efac..e80803c1 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs @@ -53,7 +53,7 @@ namespace FreeSql.SqlServer return (bool)param ? 1 : 0; else if (param is string) { - if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false) + if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && !string.IsNullOrWhiteSpace(mapColumn.Attribute.DbType) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false) return string.Concat("'", param.ToString().Replace("'", "''"), "'"); return string.Concat("N'", param.ToString().Replace("'", "''"), "'"); }