Skip to content

Commit a157f8a

Browse files
committed
- 修复 FromQueryMulti 多表重载可能出现的 null 对象报错;(合并 FromQuery 和 FromQueryMulti 代码)
1 parent 357e52a commit a157f8a

File tree

7 files changed

+27
-61
lines changed

7 files changed

+27
-61
lines changed

FreeSql.DbContext/FreeSql.DbContext.xml

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ FROM [UnitLog] a
7878
});
7979
Assert.Equal(@"SELECT a.[CkassIfCation] as1, b.[DeliveryInstractionStatus] as2, b.[UpTime] as3, 1 as4, c.[RunNo] as5
8080
FROM [UnitLog] a
81-
INNER JOIN (SELECT a.[LoadNo], a.[SeqNoLog], c.[DeliveryInstractionStatus], c.[UpTime], row_number() over( partition by a.[UnitId] order by a.[SeqNoLog] desc) [RN]
81+
INNER JOIN (
82+
SELECT a.[LoadNo], a.[SeqNoLog], c.[DeliveryInstractionStatus], c.[UpTime], row_number() over( partition by a.[UnitId] order by a.[SeqNoLog] desc) [RN]
8283
FROM [UnitLog] a
8384
INNER JOIN [LoadPlan] b ON a.[LoadNo] = b.[LoadNo] AND a.[UnitTransactionType] = N'TO'
8485
INNER JOIN [Instruction] c ON b.[InstructionNo] = c.[InstructionNo] ) b ON a.[SeqNoLog] = b.[SeqNoLog]

FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs

Lines changed: 12 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -126,74 +126,31 @@ public double Avg<TMember>(Expression<Func<T1, TMember>> column)
126126
public ISelect<T1, T2> FromQuery<T2>(ISelect<T2> select2) where T2 : class
127127
{
128128
var ret = From<T2>();
129-
var retsp = ret as Select0Provider;
130-
var rettbs = retsp._tables;
131-
if (rettbs[1].Table == null) rettbs[1].Table = TableInfo.GetDefaultTable(typeof(T2));
132-
var select2sp = select2 as Select0Provider;
133-
(_diymemexpWithTempQuery as WithTempQueryParser)?.Append(select2sp, rettbs[1]);
134-
string sql2 = null;
135-
if (select2sp._diymemexpWithTempQuery == null)
136-
{
137-
if (select2sp._tableRule == null && select2sp._tables[0].Table.Type == typeof(T2) && select2sp.IsDefaultSqlContent == true)
138-
return ret;
139-
sql2 = select2?.ToSql(a => a, FieldAliasOptions.AsProperty);
140-
}
141-
else
142-
{
143-
if (retsp._diymemexpWithTempQuery == null)
144-
retsp._diymemexpWithTempQuery = new WithTempQueryParser(null, null, null, null).Append(select2sp, rettbs[1]);
145-
if (select2sp._tableRule != null && select2sp.IsDefaultSqlContent == true)
146-
{
147-
sql2 = select2sp._tableRule(select2sp._tables[0].Table.Type, null);
148-
if (sql2.StartsWith("(") && sql2.EndsWith(")")) sql2 = sql2.Substring(1, sql2.Length - 2);
149-
if (sql2.StartsWith(" \r\n")) sql2 = sql2.Substring(3);
150-
}
151-
if (string.IsNullOrWhiteSpace(sql2))
152-
sql2 = select2?.ToSql("*");
153-
}
154-
if (retsp._tableRules.Count > 0)
155-
{
156-
var tbrules = retsp._tableRules.ToList();
157-
retsp._tableRules.Clear();
158-
tbrules.ForEach(tbrule =>
159-
{
160-
var tbruler1 = tbrule(typeof(T1), retsp._tables[0].Table.DbName);
161-
if (string.IsNullOrWhiteSpace(tbruler1) == false)
162-
retsp._tableRules.Add((type, old) =>
163-
{
164-
if (type == typeof(T1)) return tbruler1;
165-
if (type == typeof(T2)) return $"( \r\n{sql2})";
166-
167-
return old;
168-
});
169-
});
170-
}
171-
if (retsp._tableRules.Count == 0) ret.WithSql(null, $" \r\n{sql2}");
172-
return ret;
129+
return FromQueryMulti(ret, new[] { typeof(T2) }, new[] { select2 as Select0Provider });
173130
}
174131

175132
public TQuery FromQueryMulti<TQuery>(TQuery ret, Type[] entityTypes, Select0Provider[] querys)
176133
{
177134
var retsp = ret as Select0Provider;
178135
var rettbs = retsp._tables;
179-
var sql2List = new string[rettbs.Count - 1];
180-
for (var a = 1; a < rettbs.Count; a++)
136+
var sql2List = new string[querys.Length];
137+
for (var a = 0; a < querys.Length; a++)
181138
{
182-
var select2 = querys[a - 1];
183-
var entityType2 = entityTypes[a - 1];
184-
var rettb2 = rettbs[a];
139+
var select2 = querys[a];
140+
var entityType2 = entityTypes[a];
141+
var rettb2 = rettbs[a + 1];
185142
if (rettb2.Table == null) rettb2.Table = TableInfo.GetDefaultTable(entityType2);
186-
(_diymemexpWithTempQuery as WithTempQueryParser)?.Append(select2, rettb2);
143+
(retsp._diymemexpWithTempQuery as WithTempQueryParser)?.Append(select2, rettb2);
187144
string sql2 = null;
188145
if (select2._diymemexpWithTempQuery == null)
189146
{
190147
if (select2._tableRule == null && select2._tables[0].Table.Type == entityType2 && select2.IsDefaultSqlContent == true)
191148
continue;
192-
var selectorParameter = Expression.Parameter(entityType2);
149+
var selectorParameter = Expression.Parameter(entityType2, select2._tables[0].Alias);
193150
var selector = Expression.Lambda(selectorParameter, selectorParameter);
194151
select2._tables[0].Parameter = selectorParameter;
195-
var af = this.GetExpressionField(selector, FieldAliasOptions.AsProperty);
196-
sql2 = this.ToSql(af.field);
152+
var af = select2.GetExpressionField(selector, FieldAliasOptions.AsProperty);
153+
sql2 = select2.ToSqlBase(af.field);
197154
}
198155
else
199156
{
@@ -208,7 +165,7 @@ public TQuery FromQueryMulti<TQuery>(TQuery ret, Type[] entityTypes, Select0Prov
208165
if (string.IsNullOrWhiteSpace(sql2))
209166
sql2 = select2.ToSqlBase("*");
210167
}
211-
sql2List[a - 1] = sql2;
168+
sql2List[a] = sql2;
212169
}
213170
if (retsp._tableRules.Count > 0)
214171
{
@@ -232,7 +189,7 @@ public TQuery FromQueryMulti<TQuery>(TQuery ret, Type[] entityTypes, Select0Prov
232189
retsp.AsTableBase((type, old) =>
233190
{
234191
for (var a = 0; a < entityTypes.Length; a++)
235-
if (entityTypes[a] == type) return string.IsNullOrWhiteSpace(sql2List[a]) ? old : $"({sql2List[a]})";
192+
if (entityTypes[a] == type) return string.IsNullOrWhiteSpace(sql2List[a]) ? old : $"( \r\n{sql2List[a]})";
236193
return old;
237194
});
238195
}

FreeSql/Internal/CommonProvider/UpdateProvider.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -622,8 +622,7 @@ public static void GetDictionaryTableInfo(T1 source, IFreeSql orm, ref TableInfo
622622
Attribute = new DataAnnotations.ColumnAttribute
623623
{
624624
Name = colName,
625-
MapType = colType,
626-
DbType = "", //for SqlServer: ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a))
625+
MapType = colType
627626
},
628627
CsType = colType
629628
};

Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public override object AddslashesProcessParam(object param, Type mapType, Column
3939
return (bool)param ? 1 : 0;
4040
else if (param is string)
4141
{
42-
if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false)
42+
if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && !string.IsNullOrWhiteSpace(mapColumn.Attribute.DbType) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false)
4343
return string.Concat("'", param.ToString().Replace("'", "''"), "'");
4444
return string.Concat("N'", param.ToString().Replace("'", "''"), "'");
4545
}

Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public override object AddslashesProcessParam(object param, Type mapType, Column
4747
return (bool)param ? 1 : 0;
4848
else if (param is string)
4949
{
50-
if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false)
50+
if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && !string.IsNullOrWhiteSpace(mapColumn.Attribute.DbType) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false)
5151
return string.Concat("'", param.ToString().Replace("'", "''"), "'");
5252
return string.Concat("N'", param.ToString().Replace("'", "''"), "'");
5353
}

Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public override object AddslashesProcessParam(object param, Type mapType, Column
5353
return (bool)param ? 1 : 0;
5454
else if (param is string)
5555
{
56-
if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false)
56+
if (mapColumn != null && mapColumn.CsType.NullableTypeOrThis() == typeof(string) && !string.IsNullOrWhiteSpace(mapColumn.Attribute.DbType) && ncharDbTypes.Any(a => mapColumn.Attribute.DbType.Contains(a)) == false)
5757
return string.Concat("'", param.ToString().Replace("'", "''"), "'");
5858
return string.Concat("N'", param.ToString().Replace("'", "''"), "'");
5959
}

0 commit comments

Comments
 (0)