- 优化 自动分表 join 分表(自动贴合);

This commit is contained in:
2881099 2023-12-11 23:38:09 +08:00
parent a1b55508a8
commit 7f0bf3cd01
7 changed files with 717 additions and 595 deletions

View File

@ -34,14 +34,14 @@ class ModAsTableImpl : IAsTable
throw new NotImplementedException(); throw new NotImplementedException();
} }
public string[] GetTableNamesBySqlWhere(string sqlWhere, List<DbParameter> dbParams, SelectTableInfo tb, CommonUtils commonUtils) public IAsTableTableNameRangeResult GetTableNamesBySqlWhere(string sqlWhere, List<DbParameter> dbParams, SelectTableInfo tb, CommonUtils commonUtils)
{ {
var match = Regex.Match(sqlWhere, @"/\*astable\([^\)]+\)*\/"); var match = Regex.Match(sqlWhere, @"/\*astable\([^\)]+\)*\/");
if (match.Success == false) return AllTables; if (match.Success == false) return new IAsTableTableNameRangeResult(AllTables, null, null);
var tables = match.Groups[1].Value.Split(',').Where(a => AllTables.Contains(a)).ToArray(); var tables = match.Groups[1].Value.Split(',').Where(a => AllTables.Contains(a)).ToArray();
if (tables.Any() == false) return AllTables; if (tables.Any() == false) return new IAsTableTableNameRangeResult(AllTables, null, null);
return tables; return new IAsTableTableNameRangeResult(tables, null, null);
} }
public IAsTable SetDefaultAllTables(Func<string[], string[]> audit) public IAsTable SetDefaultAllTables(Func<string[], string[]> audit)
{ {

View File

@ -116,9 +116,17 @@ namespace base_entity
public string msg { get; set; } public string msg { get; set; }
public DateTime createtime { get; set; } public DateTime createtime { get; set; }
public int click { get; set; } public int click { get; set; }
} }
[Table(Name = "as_table_logext_{yyyyMMddHH}", AsTable = "createtime=2022-1-1 11(12,2 month)")]
class AsTableLogExt
{
public Guid id { get; set; }
public string msg { get; set; }
public DateTime createtime { get; set; }
public int click { get; set; }
}
public class SomeEntity public class SomeEntity
{ {
[Column(IsIdentity = true)] [Column(IsIdentity = true)]
public int Id { get; set; } public int Id { get; set; }
@ -619,13 +627,37 @@ namespace base_entity
fsql.CodeFirst.GetTableByEntity(typeof(AsTableLog)).AsTableImpl fsql.CodeFirst.GetTableByEntity(typeof(AsTableLog)).AsTableImpl
.SetTableName(0, "AsTableLog1") .SetTableName(0, "AsTableLog1")
.SetTableName(1, "AsTableLog2") .SetTableName(1, "AsTableLog2")
//.SetDefaultAllTables(value => .SetDefaultAllTables(value =>
//{ {
// if (value.Length > 3) return value.Take(3).ToArray(); if (value.Length > 3) return value.Take(3).ToArray();
// return value; return value;
//}) })
; ;
var astsql01 = fsql.Select<AsTableLog, Sys_owner>()
.InnerJoin((a, b) => a.id == b.Id)
.OrderBy((a, b) => a.createtime)
.ToSql();
var astsql02 = fsql.Select<Sys_owner, AsTableLog>()
.InnerJoin((a, b) => a.Id == b.id)
.OrderBy((a, b) => b.createtime)
.ToSql();
var astsql03 = fsql.Select<AsTableLog>()
.Where(a => a.createtime < DateTime.Parse("2023-5-1"))
.FromQuery(fsql.Select<AsTableLogExt>())
.InnerJoin((a, b) => a.id == b.id)
.OrderBy((a, b) => a.createtime)
.ToSql();
var astsql04 = fsql.Select<AsTableLog, AsTableLogExt>()
.InnerJoin((a, b) => a.id == b.id)
.Where((a,b) => a.createtime < DateTime.Parse("2023-5-1"))
.OrderBy((a, b) => a.createtime)
.ToSql();
var testitems = new[] var testitems = new[]
{ {
new AsTableLog{ msg = "msg01", createtime = DateTime.Parse("2022-1-1 13:00:11"), click = 1 }, new AsTableLog{ msg = "msg01", createtime = DateTime.Parse("2022-1-1 13:00:11"), click = 1 },
@ -1010,10 +1042,6 @@ namespace base_entity
var sqlastable2 = fsql.Update<CurrentDetail>(101).AsTable("current_detail_230501").Set(t => t.StatuId, 1).ToSql(); var sqlastable2 = fsql.Update<CurrentDetail>(101).AsTable("current_detail_230501").Set(t => t.StatuId, 1).ToSql();
var sqlastable3 = fsql.Delete<CurrentDetail>(101).AsTable("current_detail_230501").ToSql(); var sqlastable3 = fsql.Delete<CurrentDetail>(101).AsTable("current_detail_230501").ToSql();
var astsql = fsql.Select<AsTableLog, Sys_owner>()
.InnerJoin((a, b) => a.id == b.Id)
.OrderBy((a, b) => a.createtime)
.ToSql();

View File

@ -89,9 +89,21 @@ namespace FreeSql.DataAnnotations
IAsTable SetTableName(int index, string tableName); IAsTable SetTableName(int index, string tableName);
string GetTableNameByColumnValue(object columnValue, bool autoExpand = false); string GetTableNameByColumnValue(object columnValue, bool autoExpand = false);
string[] GetTableNamesByColumnValueRange(object columnValue1, object columnValue2); string[] GetTableNamesByColumnValueRange(object columnValue1, object columnValue2);
string[] GetTableNamesBySqlWhere(string sqlWhere, List<DbParameter> dbParams, SelectTableInfo tb, CommonUtils commonUtils); IAsTableTableNameRangeResult GetTableNamesBySqlWhere(string sqlWhere, List<DbParameter> dbParams, SelectTableInfo tb, CommonUtils commonUtils);
IAsTable SetDefaultAllTables(Func<string[], string[]> audit); IAsTable SetDefaultAllTables(Func<string[], string[]> audit);
} }
public class IAsTableTableNameRangeResult
{
public string[] Names { get; }
public object ColumnValue1 { get; }
public object ColumnValue2 { get; }
public IAsTableTableNameRangeResult(string[] names, object columnValue1, object columnValue2)
{
Names = names;
ColumnValue1 = columnValue1;
ColumnValue2 = columnValue2;
}
}
class DateTimeAsTableImpl : IAsTable class DateTimeAsTableImpl : IAsTable
{ {
readonly object _lock = new object(); readonly object _lock = new object();
@ -135,6 +147,17 @@ namespace FreeSql.DataAnnotations
} }
} }
} }
public NativeTuple<DateTime, DateTime> GetRangeByTableName(string tableName)
{
lock (_lock)
{
var idx = _allTables.FindIndex(a => a == tableName);
if (idx == -1) return null;
if (idx == 0) return NativeTuple.Create(_allTablesTime[idx], DateTime.Now);
if (idx == _allTables.Count - 1) return NativeTuple.Create(DateTime.MinValue, _allTablesTime[idx]);
return NativeTuple.Create(_allTablesTime[idx], _allTablesTime[idx - 1]);
}
}
DateTime ParseColumnValue(object columnValue) DateTime ParseColumnValue(object columnValue)
{ {
if (columnValue == null) throw new Exception(CoreStrings.SubTableFieldValue_IsNotNull); if (columnValue == null) throw new Exception(CoreStrings.SubTableFieldValue_IsNotNull);
@ -262,9 +285,9 @@ namespace FreeSql.DataAnnotations
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
/// <exception cref="Exception"></exception> /// <exception cref="Exception"></exception>
public string[] GetTableNamesBySqlWhere(string sqlWhere, List<DbParameter> dbParams, SelectTableInfo tb, CommonUtils commonUtils) public IAsTableTableNameRangeResult GetTableNamesBySqlWhere(string sqlWhere, List<DbParameter> dbParams, SelectTableInfo tb, CommonUtils commonUtils)
{ {
if (string.IsNullOrWhiteSpace(sqlWhere)) return _GetDefaultAllTables?.Invoke(AllTables) ?? AllTables; if (string.IsNullOrWhiteSpace(sqlWhere)) return new IAsTableTableNameRangeResult(_GetDefaultAllTables?.Invoke(AllTables) ?? AllTables, _beginTime, _lastTime);
var quoteParameterName = ""; var quoteParameterName = "";
if (commonUtils._orm.Ado.DataType == DataType.ClickHouse) quoteParameterName = "@"; //特殊处理 Clickhouse 参数化 if (commonUtils._orm.Ado.DataType == DataType.ClickHouse) quoteParameterName = "@"; //特殊处理 Clickhouse 参数化
else quoteParameterName = commonUtils.QuoteParamterName(""); else quoteParameterName = commonUtils.QuoteParamterName("");
@ -291,7 +314,7 @@ namespace FreeSql.DataAnnotations
var val1 = LocalGetParamValue(m.Groups[1].Value); var val1 = LocalGetParamValue(m.Groups[1].Value);
var val2 = LocalGetParamValue(m.Groups[2].Value); var val2 = LocalGetParamValue(m.Groups[2].Value);
if (val1 == null || val2 == null) throw new Exception(CoreStrings.Failed_SubTable_FieldValue(sqlWhere)); if (val1 == null || val2 == null) throw new Exception(CoreStrings.Failed_SubTable_FieldValue(sqlWhere));
return GetTableNamesByColumnValueRange(val1, val2); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(val1, val2), ParseColumnValue(val1), ParseColumnValue(val2));
} }
m = regs[8].Match(newSqlWhere); m = regs[8].Match(newSqlWhere);
if (m.Success) if (m.Success)
@ -299,23 +322,23 @@ namespace FreeSql.DataAnnotations
var val1 = LocalGetParamValue(m.Groups[2].Value); var val1 = LocalGetParamValue(m.Groups[2].Value);
var val2 = LocalGetParamValue(m.Groups[4].Value); var val2 = LocalGetParamValue(m.Groups[4].Value);
if (val1 == null || val2 == null) throw new Exception(CoreStrings.Failed_SubTable_FieldValue(sqlWhere)); if (val1 == null || val2 == null) throw new Exception(CoreStrings.Failed_SubTable_FieldValue(sqlWhere));
return LocalGetTables(m.Groups[1].Value, m.Groups[3].Value, ParseColumnValue(val1), ParseColumnValue(val2)); return LocalGetTables(m.Groups[1].Value, m.Groups[3].Value, ParseColumnValue(val1), ParseColumnValue(val2));
} }
m = regs[10].Match(newSqlWhere); m = regs[10].Match(newSqlWhere);
if (m.Success) if (m.Success)
{ {
var val1 = LocalGetParamValue(m.Groups[2].Value); var val1 = LocalGetParamValue(m.Groups[2].Value);
if (val1 == null) throw new Exception(CoreStrings.Failed_SubTable_FieldValue(sqlWhere)); if (val1 == null) throw new Exception(CoreStrings.Failed_SubTable_FieldValue(sqlWhere));
return LocalGetTables2(m.Groups[1].Value, ParseColumnValue(val1)); return LocalGetTables2(m.Groups[1].Value, ParseColumnValue(val1));
} }
return _GetDefaultAllTables?.Invoke(AllTables) ?? AllTables; return new IAsTableTableNameRangeResult(_GetDefaultAllTables?.Invoke(AllTables) ?? AllTables, _beginTime, _lastTime);
object LocalGetParamValue(string paramName) object LocalGetParamValue(string paramName)
{ {
if (dictParams.TryGetValue(quoteParameterName + paramName, out var trydictVal)) return trydictVal; if (dictParams.TryGetValue(quoteParameterName + paramName, out var trydictVal)) return trydictVal;
return dbParams.Where(a => a.ParameterName.Trim(quoteParameterNameCharArray) == m.Groups[2].Value).FirstOrDefault()?.Value; return dbParams.Where(a => a.ParameterName.Trim(quoteParameterNameCharArray) == paramName).FirstOrDefault()?.Value;
} }
string[] LocalGetTables(string opt1, string opt2, DateTime val1, DateTime val2) IAsTableTableNameRangeResult LocalGetTables(string opt1, string opt2, DateTime val1, DateTime val2)
{ {
switch (opt1) switch (opt1)
{ {
@ -326,15 +349,15 @@ namespace FreeSql.DataAnnotations
{ {
case "<": case "<":
val2 = val2.AddSeconds(-1); val2 = val2.AddSeconds(-1);
return GetTableNamesByColumnValueRange(_beginTime, val1 > val2 ? val2 : val1); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(_beginTime, val1 > val2 ? val2 : val1), _beginTime, val1 > val2 ? val2 : val1);
case "<=": case "<=":
return GetTableNamesByColumnValueRange(_beginTime, val1 > val2 ? val2 : val1); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(_beginTime, val1 > val2 ? val2 : val1), _beginTime, val1 > val2 ? val2 : val1);
case ">": case ">":
val2 = val2.AddSeconds(1); val2 = val2.AddSeconds(1);
return GetTableNamesByColumnValueRange(val2, val1); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(val2, val1), val2, val1);
case ">=": case ">=":
return GetTableNamesByColumnValueRange(val2, val1); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(val2, val1), val2, val1);
} }
break; break;
case ">": case ">":
case ">=": case ">=":
@ -343,38 +366,38 @@ namespace FreeSql.DataAnnotations
{ {
case "<": case "<":
val2 = val2.AddSeconds(-1); val2 = val2.AddSeconds(-1);
return GetTableNamesByColumnValueRange(val1, val2); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(val1, val2), val1, val2);
case "<=": case "<=":
return GetTableNamesByColumnValueRange(val1, val2); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(val1, val2), val1, val2);
case ">": case ">":
val2 = val2.AddSeconds(1); val2 = val2.AddSeconds(1);
return GetTableNamesByColumnValueRange(val1 > val2 ? val1 : val2, _lastTime); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(val1 > val2 ? val1 : val2, _lastTime), val1 > val2 ? val1 : val2, _lastTime);
case ">=": case ">=":
return GetTableNamesByColumnValueRange(val1 > val2 ? val1 : val2, _lastTime); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(val1 > val2 ? val1 : val2, _lastTime), val1 > val2 ? val1 : val2, _lastTime);
} }
break; break;
} }
return _GetDefaultAllTables?.Invoke(AllTables) ?? AllTables; return new IAsTableTableNameRangeResult(_GetDefaultAllTables?.Invoke(AllTables) ?? AllTables, _beginTime, _lastTime);
} }
string[] LocalGetTables2(string opt, DateTime val1) IAsTableTableNameRangeResult LocalGetTables2(string opt, DateTime val1)
{ {
switch (m.Groups[1].Value) switch (m.Groups[1].Value)
{ {
case "=": case "=":
return GetTableNamesByColumnValueRange(val1, val1); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(val1, val1), val1, val1);
case "<": case "<":
val1 = val1.AddSeconds(-1); val1 = val1.AddSeconds(-1);
return GetTableNamesByColumnValueRange(_beginTime, val1); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(_beginTime, val1), _beginTime, val1);
case "<=": case "<=":
return GetTableNamesByColumnValueRange(_beginTime, val1); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(_beginTime, val1), _beginTime, val1);
case ">": case ">":
val1 = val1.AddSeconds(1); val1 = val1.AddSeconds(1);
return GetTableNamesByColumnValueRange(val1, _lastTime); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(val1, _lastTime), val1, _lastTime);
case ">=": case ">=":
return GetTableNamesByColumnValueRange(val1, _lastTime); return new IAsTableTableNameRangeResult(GetTableNamesByColumnValueRange(val1, _lastTime), val1, _lastTime);
} }
return _GetDefaultAllTables?.Invoke(AllTables) ?? AllTables; return new IAsTableTableNameRangeResult(_GetDefaultAllTables?.Invoke(AllTables) ?? AllTables, _beginTime, _lastTime);
} }
} }
public string[] AllTables public string[] AllTables

File diff suppressed because it is too large Load Diff

View File

@ -212,7 +212,7 @@ namespace FreeSql.Internal.CommonProvider
if (_table.AsTableImpl != null && string.IsNullOrWhiteSpace(_tableRule?.Invoke(_table.DbName)) == true) if (_table.AsTableImpl != null && string.IsNullOrWhiteSpace(_tableRule?.Invoke(_table.DbName)) == true)
{ {
var oldTableRule = _tableRule; var oldTableRule = _tableRule;
var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils); var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils).Names;
foreach (var name in names) foreach (var name in names)
{ {
_tableRule = old => name; _tableRule = old => name;
@ -247,7 +247,7 @@ namespace FreeSql.Internal.CommonProvider
if (_table.AsTableImpl != null && string.IsNullOrWhiteSpace(_tableRule?.Invoke(_table.DbName)) == true) if (_table.AsTableImpl != null && string.IsNullOrWhiteSpace(_tableRule?.Invoke(_table.DbName)) == true)
{ {
var oldTableRule = _tableRule; var oldTableRule = _tableRule;
var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils); var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils).Names;
foreach (var name in names) foreach (var name in names)
{ {
_tableRule = old => name; _tableRule = old => name;

View File

@ -1,4 +1,5 @@
using FreeSql.Internal.Model; using FreeSql.DataAnnotations;
using FreeSql.Internal.Model;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Concurrent; using System.Collections.Concurrent;
@ -49,7 +50,8 @@ namespace FreeSql.Internal.CommonProvider
public BaseDiyMemberExpression _diymemexpWithTempQuery; public BaseDiyMemberExpression _diymemexpWithTempQuery;
public Func<DbTransaction> _resolveHookTransaction; public Func<DbTransaction> _resolveHookTransaction;
public bool IsDefaultSqlContent => _distinct == false && _is_AsTreeCte == false && _tables.Count == 1 && _where.Length == 0 && _join.Length == 0 && public bool IsDefaultSqlContent => _tables.Count == 1 && _tables[0].Table?.AsTableImpl == null &&
_distinct == false && _is_AsTreeCte == false && _where.Length == 0 && _join.Length == 0 &&
string.IsNullOrWhiteSpace(_orderby) && string.IsNullOrWhiteSpace(_groupby) && string.IsNullOrWhiteSpace(_tosqlAppendContent) && string.IsNullOrWhiteSpace(_orderby) && string.IsNullOrWhiteSpace(_groupby) && string.IsNullOrWhiteSpace(_tosqlAppendContent) &&
_aliasRule == null && _selectExpression == null; _aliasRule == null && _selectExpression == null;
@ -868,25 +870,36 @@ namespace FreeSql.Internal.CommonProvider
var unions = new List<Dictionary<Type, string>>(); 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>>(new[] { new Func<Type, string, string>((type, oldname) => null) });
if (trs.Count == 1 && _tables.Any(a => a.Table != null && a.Table.AsTableImpl != null && string.IsNullOrWhiteSpace(trs[0](a.Table.Type, a.Table.DbName)) == true)) if (trs.Count == 1 && _tables.Any(a => a.Table != null && a.Table.AsTableImpl != null &&
string.IsNullOrWhiteSpace(trs[0](a.Table.Type, a.Table.AsTableImpl != null ? null : a.Table.DbName)) == true))
{ {
string[] LocalGetTableNames(SelectTableInfo tb) DateTime? DateTimeAsTableImplStart = null, DateTimeAsTableImplEnd = null;
string[] LocalGetTableNames(SelectTableInfo tb)
{ {
var trname = trs[0](tb.Table.Type, tb.Table.DbName); var trname = trs[0](tb.Table.Type, tb.Table.AsTableImpl != null ? null : tb.Table.DbName);
if (tb.Table.AsTableImpl != null && string.IsNullOrWhiteSpace(trname) == true) if (tb.Table.AsTableImpl != null && string.IsNullOrWhiteSpace(trname) == true)
{ {
string[] aret = null; var aret = tb.Table.AsTableImpl.GetTableNamesBySqlWhere(_where.Length == 0 ? null : _where.ToString(), _params, tb, _commonUtils);
if (_where.Length == 0) aret = tb.Table.AsTableImpl.AllTables; if (aret.Names.Any() == false)
else aret = tb.Table.AsTableImpl.GetTableNamesBySqlWhere(_where.ToString(), _params, tb, _commonUtils);
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(); var now = DateTime.Now;
if (_orm.CodeFirst.IsSyncStructureToUpper) aret[a] = aret[a].ToUpper(); aret = new IAsTableTableNameRangeResult(tb.Table.AsTableImpl.AllTables.Take(1).ToArray(), now, now);
if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(tb.Table.Type, aret[a]);
} }
return aret;
for (var a = 0; a < aret.Names.Length; a++)
{
if (_orm.CodeFirst.IsSyncStructureToLower) aret.Names[a] = aret.Names[a].ToLower();
if (_orm.CodeFirst.IsSyncStructureToUpper) aret.Names[a] = aret.Names[a].ToUpper();
if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(tb.Table.Type, aret.Names[a]);
}
if (tb.Table.AsTableImpl is DateTimeAsTableImpl)
{
if (aret.ColumnValue1 is DateTime dt1)
if (DateTimeAsTableImplStart == null || dt1 > DateTimeAsTableImplStart) DateTimeAsTableImplStart = dt1;
if (aret.ColumnValue2 is DateTime dt2)
if (DateTimeAsTableImplEnd == null || dt2 < DateTimeAsTableImplEnd) DateTimeAsTableImplEnd = dt2;
}
return aret.Names;
} }
if (string.IsNullOrWhiteSpace(trname) == false) if (string.IsNullOrWhiteSpace(trname) == false)
{ {
@ -902,13 +915,17 @@ namespace FreeSql.Internal.CommonProvider
} }
return new string[] { tb.Table.DbName }; 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 tbnames = _tables.Where(a => a.Type != SelectTableInfoType.Parent).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>(); if (DateTimeAsTableImplStart != null && DateTimeAsTableImplEnd != null && tbnames.Where(a => a.Names.Length > 1).Count() > 1)
{
tbnames = tbnames.Select(a => new { a.Tb, Names = a.Tb.Table.AsTableImpl?.GetTableNamesByColumnValueRange(DateTimeAsTableImplStart, DateTimeAsTableImplEnd) ?? a.Names }).ToList();
}
var dict = new Dictionary<Type, string>();
tbnames.ForEach(a => tbnames.ForEach(a =>
{ {
dict.Add(a.Tb.Table.Type, a.Names[0]); dict.Add(a.Tb.Table.Type, a.Names[0]);
}); });
unions.Add(dict); unions.Add(dict);
for (var a = 0; a < tbnames.Count; a++) for (var a = 0; a < tbnames.Count; a++)
{ {
if (tbnames[a].Names.Length <= 1) continue; if (tbnames[a].Names.Length <= 1) continue;
@ -920,10 +937,34 @@ namespace FreeSql.Internal.CommonProvider
dict = new Dictionary<Type, string>(); dict = new Dictionary<Type, string>();
foreach (var uit in unions[d]) foreach (var uit in unions[d])
dict.Add(uit.Key, uit.Key == tbnames[a].Tb.Table.Type ? tbnames[a].Names[b] : uit.Value); dict.Add(uit.Key, uit.Key == tbnames[a].Tb.Table.Type ? tbnames[a].Names[b] : uit.Value);
unions.Add(dict); unions.Add(dict);
} }
} }
} }
if (DateTimeAsTableImplStart != null && DateTimeAsTableImplEnd != null && tbnames.Where(a => a.Names.Length > 1).Count() > 1)
{
for (var uidx = unions.Count - 1; uidx >= 0; uidx--)
{
var ignore = false;
DateTime? dtStart = null, dtEnd = null;
foreach (var ut in unions[uidx])
{
if (tbnames.Where(a => a.Tb.Table.Type == ut.Key).FirstOrDefault()?.Tb.Table?.AsTableImpl is DateTimeAsTableImpl dtImpl == false) continue;
var dtRange = dtImpl.GetRangeByTableName(ut.Value);
if (dtRange == null) continue;
if (dtStart == null) dtStart = dtRange.Item1;
if (dtEnd == null) dtEnd = dtRange.Item2;
if (dtRange.Item1 >= dtEnd || dtRange.Item2 <= dtStart)
{
ignore = true;
break;
}
if (dtRange.Item1 > dtStart) dtStart = dtRange.Item1;
if (dtRange.Item2 < dtEnd) dtEnd = dtRange.Item2;
}
if (ignore) unions.RemoveAt(uidx);
}
}
return unions; return unions;
} }
if (trs.Any() == false) trs.Add(new Func<Type, string, string>((type, oldname) => null)); if (trs.Any() == false) trs.Add(new Func<Type, string, string>((type, oldname) => null));

View File

@ -971,7 +971,7 @@ namespace FreeSql.Internal.CommonProvider
if (_table.AsTableImpl != null && string.IsNullOrWhiteSpace(_tableRule?.Invoke(_table.DbName)) == true) if (_table.AsTableImpl != null && string.IsNullOrWhiteSpace(_tableRule?.Invoke(_table.DbName)) == true)
{ {
var oldTableRule = _tableRule; var oldTableRule = _tableRule;
var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils); var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils).Names;
foreach (var name in names) foreach (var name in names)
{ {
_tableRule = old => name; _tableRule = old => name;
@ -1005,7 +1005,7 @@ namespace FreeSql.Internal.CommonProvider
if (_table.AsTableImpl != null && string.IsNullOrWhiteSpace(_tableRule?.Invoke(_table.DbName)) == true) if (_table.AsTableImpl != null && string.IsNullOrWhiteSpace(_tableRule?.Invoke(_table.DbName)) == true)
{ {
var oldTableRule = _tableRule; var oldTableRule = _tableRule;
var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils); var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils).Names;
foreach (var name in names) foreach (var name in names)
{ {
_tableRule = old => name; _tableRule = old => name;