- 完成 [Table(AsTable = xx)] 分表特性查询;

This commit is contained in:
2881099
2022-04-09 15:40:17 +08:00
parent abaeb7efd5
commit 980ee1e893
20 changed files with 147 additions and 85 deletions

View File

@ -1690,6 +1690,7 @@ namespace FreeSql.Internal
public abstract string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc);
public abstract string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc);
public abstract string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc);
public string ExpressionConstDateTime(Expression exp) => exp is ConstantExpression operandExpConst ? formatSql(Utils.GetDataReaderValue(typeof(DateTime), operandExpConst.Value), null, null, null) : null;
public enum ExpressionStyle
{

View File

@ -195,7 +195,7 @@ namespace FreeSql.Internal.CommonProvider
var sb = new StringBuilder();
if (_table.AsTableImpl != null)
{
var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, _table, _commonUtils);
var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils);
foreach (var name in names)
{
_tableRule = old => name;
@ -228,7 +228,7 @@ namespace FreeSql.Internal.CommonProvider
var sb = new StringBuilder();
if (_table.AsTableImpl != null)
{
var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, _table, _commonUtils);
var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils);
foreach (var name in names)
{
_tableRule = old => name;

View File

@ -460,7 +460,54 @@ namespace FreeSql.Internal.CommonProvider
protected List<Dictionary<Type, string>> GetTableRuleUnions()
{
var unions = new List<Dictionary<Type, string>>();
var trs = _tableRules.Any() ? _tableRules : new List<Func<Type, string, string>>(new[] { new Func<Type, string, string>((type, oldname) => null) });
var trs = _tableRules.Any() ? _tableRules : new List<Func<Type, string, string>>();
if (trs.Any() == false)
{
string[] LocalGetTableNames(SelectTableInfo tb)
{
if (tb.Table.AsTableImpl != null)
{
string[] aret = null;
if (_where.Length == 0) aret = tb.Table.AsTableImpl.AllTables.ToArray();
else aret = tb.Table.AsTableImpl.GetTableNamesBySqlWhere(_where.ToString(), _params, tb, _commonUtils).ToArray();
if (aret.Any() == false) aret = tb.Table.AsTableImpl.AllTables.Take(1).ToArray();
for (var a = 0; a < aret.Length; a++)
{
if (_orm.CodeFirst.IsSyncStructureToLower) aret[a] = aret[a].ToLower();
if (_orm.CodeFirst.IsSyncStructureToUpper) aret[a] = aret[a].ToUpper();
if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(tb.Table.Type, aret[a]);
}
return aret;
}
return new string[] { tb.Table.DbName };
}
var tbnames = _tables.GroupBy(a => a.Table.Type).Select(g => _tables.Where(a => a.Table.Type == g.Key).FirstOrDefault()).Select(a => new { Tb = a, Names = LocalGetTableNames(a) }).ToList();
var dict = new Dictionary<Type, string>();
tbnames.ForEach(a =>
{
dict.Add(a.Tb.Table.Type, a.Names[0]);
});
unions.Add(dict);
for (var a = 0; a < tbnames.Count; a++)
{
if (tbnames[a].Names.Length <= 1) continue;
var unionsCount = unions.Count;
for (var b = 1; b < tbnames[a].Names.Length; b++)
{
for (var d = 0; d < unionsCount; d++)
{
dict = new Dictionary<Type, string>();
foreach (var uit in unions[d])
dict.Add(uit.Key, uit.Key == tbnames[a].Tb.Table.Type ? tbnames[a].Names[b] : uit.Value);
unions.Add(dict);
}
}
}
return unions;
}
if (trs.Any() == false) trs.Add(new Func<Type, string, string>((type, oldname) => null));
foreach (var tr in trs)
{
var dict = new Dictionary<Type, string>();

View File

@ -803,7 +803,7 @@ namespace FreeSql.Internal.CommonProvider
var sb = new StringBuilder();
if (_table.AsTableImpl != null)
{
var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, _table, _commonUtils);
var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils);
foreach (var name in names)
{
_tableRule = old => name;
@ -835,7 +835,7 @@ namespace FreeSql.Internal.CommonProvider
var sb = new StringBuilder();
if (_table.AsTableImpl != null)
{
var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, _table, _commonUtils);
var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils);
foreach (var name in names)
{
_tableRule = old => name;