Synchronization code

This commit is contained in:
sunkaixuan 2022-12-18 15:32:01 +08:00
parent dce9bfe53b
commit 9a00bc99d4
2 changed files with 62 additions and 57 deletions

View File

@ -1451,7 +1451,64 @@ namespace SqlSugar
#endregion
#region Subquery
private bool IsSubToList()
{
return this.QueryBuilder.SubToListParameters != null && this.QueryBuilder.SubToListParameters.Count > 0;
}
public virtual ISugarQueryable<T> MergeTableWithSubToListJoin()
{
//_ToSql();
var clone = this.Clone();
clone.QueryBuilder.AppendValues = null;
clone.QueryBuilder.SubToListParameters = null;
clone.QueryBuilder.AppendColumns = null;
Check.Exception(this.MapperAction != null || this.MapperActionWithCache != null, ErrorMessage.GetThrowMessage("'Mapper needs to be written after MergeTable ", "Mapper 只能在 MergeTable 之后使用"));
//Check.Exception(this.QueryBuilder.SelectValue.IsNullOrEmpty(),ErrorMessage.GetThrowMessage( "MergeTable need to use Queryable.Select Method .", "使用MergeTable之前必须要有Queryable.Select方法"));
//Check.Exception(this.QueryBuilder.Skip > 0 || this.QueryBuilder.Take > 0 || this.QueryBuilder.OrderByValue.HasValue(),ErrorMessage.GetThrowMessage( "MergeTable Queryable cannot Take Skip OrderBy PageToList ", "使用 MergeTable不能有 Take Skip OrderBy PageToList 等操作,你可以在Mergetable之后操作"));
var sqlobj = clone.ToSql();
var index = QueryBuilder.WhereIndex + 1;
var result = this.Context.Queryable<T>().AS(SqlBuilder.GetPackTable(sqlobj.Key, "MergeTable")).AddParameters(sqlobj.Value).Select("*").With(SqlWith.Null);
result.QueryBuilder.WhereIndex = index;
result.QueryBuilder.LambdaExpressions.ParameterIndex = QueryBuilder.LambdaExpressions.ParameterIndex++;
result.QueryBuilder.LambdaExpressions.Index = QueryBuilder.LambdaExpressions.Index++;
if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
{
result.Select("MergeTable.*");
}
result.QueryBuilder.AppendValues = this.QueryBuilder.AppendValues;
result.QueryBuilder.SubToListParameters = this.QueryBuilder.SubToListParameters;
result.QueryBuilder.AppendColumns = this.QueryBuilder.AppendColumns;
return result;
}
public virtual ISugarQueryable<T> MergeTableWithSubToList()
{
_ToSql();
var clone = this.Clone();
clone.QueryBuilder.AppendValues = null;
clone.QueryBuilder.SubToListParameters = null;
clone.QueryBuilder.AppendColumns = null;
Check.Exception(this.MapperAction != null || this.MapperActionWithCache != null, ErrorMessage.GetThrowMessage("'Mapper needs to be written after MergeTable ", "Mapper 只能在 MergeTable 之后使用"));
//Check.Exception(this.QueryBuilder.SelectValue.IsNullOrEmpty(),ErrorMessage.GetThrowMessage( "MergeTable need to use Queryable.Select Method .", "使用MergeTable之前必须要有Queryable.Select方法"));
//Check.Exception(this.QueryBuilder.Skip > 0 || this.QueryBuilder.Take > 0 || this.QueryBuilder.OrderByValue.HasValue(),ErrorMessage.GetThrowMessage( "MergeTable Queryable cannot Take Skip OrderBy PageToList ", "使用 MergeTable不能有 Take Skip OrderBy PageToList 等操作,你可以在Mergetable之后操作"));
var sqlobj = clone.ToSql();
var index = QueryBuilder.WhereIndex + 1;
var result = this.Context.Queryable<T>().AS(SqlBuilder.GetPackTable(sqlobj.Key, "MergeTable")).AddParameters(sqlobj.Value).Select("*").With(SqlWith.Null);
result.QueryBuilder.WhereIndex = index;
result.QueryBuilder.LambdaExpressions.ParameterIndex = QueryBuilder.LambdaExpressions.ParameterIndex++;
result.QueryBuilder.LambdaExpressions.Index = QueryBuilder.LambdaExpressions.Index++;
if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
{
result.Select("MergeTable.*");
}
result.QueryBuilder.AppendValues = this.QueryBuilder.AppendValues;
result.QueryBuilder.SubToListParameters = this.QueryBuilder.SubToListParameters;
result.QueryBuilder.AppendColumns = this.QueryBuilder.AppendColumns;
return result;
}
private void _SubQuery<TResult>(List<TResult> result)
{
if (result == null || result.Count == 0)

View File

@ -1100,79 +1100,27 @@ namespace SqlSugar
public virtual ISugarQueryable<T> MergeTable()
{
if (this.QueryBuilder.SubToListParameters != null && this.QueryBuilder.SubToListParameters.Count > 0)
if (IsSubToList())
{
return MergeTableWithSubToList();
}
Check.Exception(this.MapperAction != null || this.MapperActionWithCache != null,ErrorMessage.GetThrowMessage( "'Mapper needs to be written after MergeTable ", "Mapper 只能在 MergeTable 之后使用"));
Check.Exception(this.MapperAction != null || this.MapperActionWithCache != null, ErrorMessage.GetThrowMessage("'Mapper needs to be written after MergeTable ", "Mapper 只能在 MergeTable 之后使用"));
//Check.Exception(this.QueryBuilder.SelectValue.IsNullOrEmpty(),ErrorMessage.GetThrowMessage( "MergeTable need to use Queryable.Select Method .", "使用MergeTable之前必须要有Queryable.Select方法"));
//Check.Exception(this.QueryBuilder.Skip > 0 || this.QueryBuilder.Take > 0 || this.QueryBuilder.OrderByValue.HasValue(),ErrorMessage.GetThrowMessage( "MergeTable Queryable cannot Take Skip OrderBy PageToList ", "使用 MergeTable不能有 Take Skip OrderBy PageToList 等操作,你可以在Mergetable之后操作"));
var sqlobj = this._ToSql();
if(this.QueryBuilder.SubToListParameters != null && this.QueryBuilder.SubToListParameters.Count > 0)
if (IsSubToList())
{
return MergeTableWithSubToListJoin();
return MergeTableWithSubToListJoin();
}
var index = QueryBuilder.WhereIndex + 1;
var result = this.Context.Queryable<T>().AS(SqlBuilder.GetPackTable(sqlobj.Key, "MergeTable")).AddParameters(sqlobj.Value).Select("*").With(SqlWith.Null);
result.QueryBuilder.WhereIndex = index;
result.QueryBuilder.LambdaExpressions.ParameterIndex = QueryBuilder.LambdaExpressions.ParameterIndex++;
result.QueryBuilder.LambdaExpressions.Index = QueryBuilder.LambdaExpressions.Index++;
if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
{
result.Select("MergeTable.*");
}
return result;
}
public virtual ISugarQueryable<T> MergeTableWithSubToListJoin()
{
//_ToSql();
var clone = this.Clone();
clone.QueryBuilder.AppendValues = null;
clone.QueryBuilder.SubToListParameters = null;
clone.QueryBuilder.AppendColumns = null;
Check.Exception(this.MapperAction != null || this.MapperActionWithCache != null, ErrorMessage.GetThrowMessage("'Mapper needs to be written after MergeTable ", "Mapper 只能在 MergeTable 之后使用"));
//Check.Exception(this.QueryBuilder.SelectValue.IsNullOrEmpty(),ErrorMessage.GetThrowMessage( "MergeTable need to use Queryable.Select Method .", "使用MergeTable之前必须要有Queryable.Select方法"));
//Check.Exception(this.QueryBuilder.Skip > 0 || this.QueryBuilder.Take > 0 || this.QueryBuilder.OrderByValue.HasValue(),ErrorMessage.GetThrowMessage( "MergeTable Queryable cannot Take Skip OrderBy PageToList ", "使用 MergeTable不能有 Take Skip OrderBy PageToList 等操作,你可以在Mergetable之后操作"));
var sqlobj = clone.ToSql();
var index = QueryBuilder.WhereIndex + 1;
var result = this.Context.Queryable<T>().AS(SqlBuilder.GetPackTable(sqlobj.Key, "MergeTable")).AddParameters(sqlobj.Value).Select("*").With(SqlWith.Null);
result.QueryBuilder.WhereIndex = index;
result.QueryBuilder.LambdaExpressions.ParameterIndex = QueryBuilder.LambdaExpressions.ParameterIndex++;
result.QueryBuilder.LambdaExpressions.Index = QueryBuilder.LambdaExpressions.Index++;
if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
{
result.Select("MergeTable.*");
}
result.QueryBuilder.AppendValues = this.QueryBuilder.AppendValues;
result.QueryBuilder.SubToListParameters = this.QueryBuilder.SubToListParameters;
result.QueryBuilder.AppendColumns = this.QueryBuilder.AppendColumns;
return result;
}
public virtual ISugarQueryable<T> MergeTableWithSubToList()
{
_ToSql();
var clone = this.Clone();
clone.QueryBuilder.AppendValues = null;
clone.QueryBuilder.SubToListParameters = null;
clone.QueryBuilder.AppendColumns = null;
Check.Exception(this.MapperAction != null || this.MapperActionWithCache != null, ErrorMessage.GetThrowMessage("'Mapper needs to be written after MergeTable ", "Mapper 只能在 MergeTable 之后使用"));
//Check.Exception(this.QueryBuilder.SelectValue.IsNullOrEmpty(),ErrorMessage.GetThrowMessage( "MergeTable need to use Queryable.Select Method .", "使用MergeTable之前必须要有Queryable.Select方法"));
//Check.Exception(this.QueryBuilder.Skip > 0 || this.QueryBuilder.Take > 0 || this.QueryBuilder.OrderByValue.HasValue(),ErrorMessage.GetThrowMessage( "MergeTable Queryable cannot Take Skip OrderBy PageToList ", "使用 MergeTable不能有 Take Skip OrderBy PageToList 等操作,你可以在Mergetable之后操作"));
var sqlobj = clone.ToSql();
var index = QueryBuilder.WhereIndex + 1;
var result = this.Context.Queryable<T>().AS(SqlBuilder.GetPackTable(sqlobj.Key, "MergeTable")).AddParameters(sqlobj.Value).Select("*").With(SqlWith.Null);
result.QueryBuilder.WhereIndex = index;
result.QueryBuilder.LambdaExpressions.ParameterIndex = QueryBuilder.LambdaExpressions.ParameterIndex++;
result.QueryBuilder.LambdaExpressions.Index = QueryBuilder.LambdaExpressions.Index++;
if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
{
result.Select("MergeTable.*");
}
result.QueryBuilder.AppendValues = this.QueryBuilder.AppendValues;
result.QueryBuilder.SubToListParameters = this.QueryBuilder.SubToListParameters;
result.QueryBuilder.AppendColumns = this.QueryBuilder.AppendColumns;
return result;
}