- 增加 ISelect<T> FromQuery 重载多表嵌套;

This commit is contained in:
2881099
2023-03-03 00:37:18 +08:00
parent 5c5116c650
commit 8b5b23202c
6 changed files with 348 additions and 197 deletions

View File

@ -80,6 +80,9 @@ namespace FreeSql.Internal.CommonProvider
_diymemexpWithTempQuery = null;
}
public abstract string ToSqlBase(string field = null);
public abstract void AsTableBase(Func<Type, string, string> tableRule);
public static void CopyData(Select0Provider from, Select0Provider to, ReadOnlyCollection<ParameterExpression> lambParms)
{
if (to == null) return;
@ -221,9 +224,10 @@ namespace FreeSql.Internal.CommonProvider
}
}
public WithTempQueryParser Append<TDto>(ISelect<TDto> select, SelectTableInfo outsideTable)
public WithTempQueryParser Append(Select0Provider select, SelectTableInfo outsideTable)
{
if (outsideTable != null && (select as Select0Provider)?._diymemexpWithTempQuery is WithTempQueryParser withTempQuery)
//select is ISelect<T>
if (outsideTable != null && select?._diymemexpWithTempQuery is WithTempQueryParser withTempQuery)
{
_insideSelectList.Add(withTempQuery._insideSelectList[0]);
_outsideTable.Add(outsideTable);
@ -927,6 +931,7 @@ namespace FreeSql.Internal.CommonProvider
}
return unions;
}
public override void AsTableBase(Func<Type, string, string> tableRule) => AsTable(tableRule);
public TSelect AsTable(Func<Type, string, string> tableRule)
{
if (_tableRules.Count == 1 && _diymemexpWithTempQuery != null && _diymemexpWithTempQuery is WithTempQueryParser tempQueryParser)
@ -958,6 +963,7 @@ namespace FreeSql.Internal.CommonProvider
if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(entityType);
return this as TSelect;
}
public override string ToSqlBase(string field = null) => ToSql(field);
public abstract string ToSql(string field = null);
public TSelect Where(string sql, object parms = null) => this.WhereIf(true, sql, parms);

View File

@ -123,15 +123,14 @@ namespace FreeSql.Internal.CommonProvider
public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, ISelectFromExpression<T1>>> exp = null) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class where T14 : class where T15 : class;
public abstract ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>(Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, ISelectFromExpression<T1>>> exp = null) where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class where T11 : class where T12 : class where T13 : class where T14 : class where T15 : class where T16 : class;
public ISelect<T1, T2> FromQuery<T2>(ISelect<T2> select2) where T2 : class
{
var ret = From<T2>();
var retsp = ret as Select0Provider;
var rettbs = retsp._tables;
if (rettbs[1].Table == null) rettbs[1].Table = TableInfo.GetDefaultTable(typeof(T2));
(_diymemexpWithTempQuery as WithTempQueryParser)?.Append(select2, rettbs[1]);
var select2sp = select2 as Select0Provider;
(_diymemexpWithTempQuery as WithTempQueryParser)?.Append(select2sp, rettbs[1]);
string sql2 = null;
if (select2sp._diymemexpWithTempQuery == null)
{
@ -142,7 +141,7 @@ namespace FreeSql.Internal.CommonProvider
else
{
if (retsp._diymemexpWithTempQuery == null)
retsp._diymemexpWithTempQuery = new WithTempQueryParser(null, null, null, null).Append(select2, rettbs[1]);
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);
@ -172,6 +171,89 @@ namespace FreeSql.Internal.CommonProvider
if (retsp._tableRules.Count == 0) ret.WithSql(null, $" \r\n{sql2}");
return ret;
}
public TQuery FromQueryMulti<TQuery>(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 select2 = querys[a - 1];
var entityType2 = entityTypes[a - 1];
var rettb2 = rettbs[a];
if (rettb2.Table == null) rettb2.Table = TableInfo.GetDefaultTable(entityType2);
(_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 selector = Expression.Lambda(selectorParameter, selectorParameter);
select2._tables[0].Parameter = selectorParameter;
var af = this.GetExpressionField(selector, FieldAliasOptions.AsProperty);
sql2 = this.ToSql(af.field);
}
else
{
if (retsp._diymemexpWithTempQuery == null)
retsp._diymemexpWithTempQuery = new WithTempQueryParser(null, null, null, null).Append(select2, rettb2);
if (select2._tableRule != null && select2.IsDefaultSqlContent == true)
{
sql2 = select2._tableRule(select2._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.ToSqlBase("*");
}
sql2List[a - 1] = sql2;
}
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;
for (var a = 0; a < entityTypes.Length; a++)
if (entityTypes[a] == type) return string.IsNullOrWhiteSpace(sql2List[a]) ? old : $"( \r\n{sql2List[a]})";
return old;
});
});
}
if (retsp._tableRules.Count == 0)
{
retsp.AsTableBase((type, old) =>
{
for (var a = 0; a < entityTypes.Length; a++)
if (entityTypes[a] == type) return string.IsNullOrWhiteSpace(sql2List[a]) ? old : $"({sql2List[a]})";
return old;
});
}
return ret;
}
public ISelect<T1, T2, T3> FromQuery<T2, T3>(ISelect<T2> select2, ISelect<T3> select3) where T2 : class where T3 : class
{
var ret = From<T2, T3>();
return FromQueryMulti(ret, new[] { typeof(T2), typeof(T3) }, new[] { select2 as Select0Provider, select3 as Select0Provider });
}
public ISelect<T1, T2, T3, T4> FromQuery<T2, T3, T4>(ISelect<T2> select2, ISelect<T3> select3, ISelect<T4> select4) where T2 : class where T3 : class where T4 : class
{
var ret = From<T2, T3, T4>();
return FromQueryMulti(ret, new[] { typeof(T2), typeof(T3), typeof(T4) }, new[] { select2 as Select0Provider, select3 as Select0Provider, select4 as Select0Provider });
}
public ISelect<T1, T2, T3, T4, T5> FromQuery<T2, T3, T4, T5>(ISelect<T2> select2, ISelect<T3> select3, ISelect<T4> select4, ISelect<T5> select5) where T2 : class where T3 : class where T4 : class where T5 : class
{
var ret = From<T2, T3, T4, T5>();
return FromQueryMulti(ret, new[] { typeof(T2), typeof(T3), typeof(T4), typeof(T5) }, new[] { select2 as Select0Provider, select3 as Select0Provider, select4 as Select0Provider, select5 as Select0Provider });
}
public ISelect<T1> UnionAll(params ISelect<T1>[] querys)
{
var sql1 = this.ToSql();