mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-19 12:28:15 +08:00
- 增加 ISelect<T> FromQuery 重载多表嵌套;
This commit is contained in:
@ -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);
|
||||
|
@ -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();
|
||||
|
Reference in New Issue
Block a user