mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
- 优化 自动分表 join 分表(自动贴合);
This commit is contained in:
parent
a1b55508a8
commit
7f0bf3cd01
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
1070
FreeSql/FreeSql.xml
1070
FreeSql/FreeSql.xml
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||||
|
@ -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));
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user