Synchronization code

This commit is contained in:
sunkaixuan 2022-10-04 23:02:01 +08:00
parent a23c241a8e
commit c2cc1f064a
7 changed files with 86 additions and 9 deletions

View File

@ -16,6 +16,8 @@ namespace SqlSugar
navigat.SelectR1 = SelectR1;
navigat.Expressions = expressions;
navigat.Context = this.Context;
navigat.IsCrossQueryWithAttr = this.QueryBuilder.IsCrossQueryWithAttr;
navigat.CrossQueryItems = this.QueryBuilder.CrossQueryItems;
if (this.QueryBuilder.Includes == null) this.QueryBuilder.Includes = new List<object>();
this.QueryBuilder.Includes.Add(navigat);
}
@ -26,6 +28,8 @@ namespace SqlSugar
var navigat = new NavigatManager<T>();
navigat.SelectR1 = SelectR1;
navigat.SelectR2 = SelectR2;
navigat.IsCrossQueryWithAttr = this.QueryBuilder.IsCrossQueryWithAttr;
navigat.CrossQueryItems = this.QueryBuilder.CrossQueryItems;
navigat.Expressions = expressions;
navigat.Context = this.Context;
if (this.QueryBuilder.Includes == null) this.QueryBuilder.Includes = new List<object>();
@ -40,6 +44,8 @@ namespace SqlSugar
navigat.SelectR1 = SelectR1;
navigat.SelectR2 = SelectR2;
navigat.SelectR3 = SelectR3;
navigat.IsCrossQueryWithAttr = this.QueryBuilder.IsCrossQueryWithAttr;
navigat.CrossQueryItems = this.QueryBuilder.CrossQueryItems;
navigat.Expressions = expressions;
navigat.Context = this.Context;
if (this.QueryBuilder.Includes == null) this.QueryBuilder.Includes = new List<object>();
@ -69,6 +75,8 @@ namespace SqlSugar
navigat.SelectR1 = SelectR1;
navigat.Expressions = expressions;
navigat.Context = this.Context;
navigat.IsCrossQueryWithAttr = this.QueryBuilder.IsCrossQueryWithAttr;
navigat.CrossQueryItems = this.QueryBuilder.CrossQueryItems;
if (this.QueryBuilder.Includes == null) this.QueryBuilder.Includes = new List<object>();
this.QueryBuilder.Includes.Add(navigat);
}
@ -80,6 +88,8 @@ namespace SqlSugar
navigat.SelectR1 = SelectR1;
navigat.SelectR2 = SelectR2;
navigat.Expressions = expressions;
navigat.IsCrossQueryWithAttr = this.QueryBuilder.IsCrossQueryWithAttr;
navigat.CrossQueryItems = this.QueryBuilder.CrossQueryItems;
navigat.Context = this.Context;
if (this.QueryBuilder.Includes == null) this.QueryBuilder.Includes = new List<object>();
this.QueryBuilder.Includes.Add(navigat);
@ -94,6 +104,8 @@ namespace SqlSugar
navigat.SelectR2 = SelectR2;
navigat.SelectR3 = SelectR3;
navigat.Expressions = expressions;
navigat.IsCrossQueryWithAttr = this.QueryBuilder.IsCrossQueryWithAttr;
navigat.CrossQueryItems = this.QueryBuilder.CrossQueryItems;
navigat.Context = this.Context;
if (this.QueryBuilder.Includes == null) this.QueryBuilder.Includes = new List<object>();
this.QueryBuilder.Includes.Add(navigat);
@ -110,6 +122,8 @@ namespace SqlSugar
navigat.SelectR3 = SelectR3;
navigat.SelectR4 = SelectR4;
navigat.Expressions = expressions;
navigat.IsCrossQueryWithAttr = this.QueryBuilder.IsCrossQueryWithAttr;
navigat.CrossQueryItems = this.QueryBuilder.CrossQueryItems;
navigat.Context = this.Context;
if (this.QueryBuilder.Includes == null) this.QueryBuilder.Includes = new List<object>();
this.QueryBuilder.Includes.Add(navigat);
@ -128,6 +142,8 @@ namespace SqlSugar
navigat.SelectR4 = SelectR4;
navigat.SelectR5 = SelectR5;
navigat.Expressions = expressions;
navigat.IsCrossQueryWithAttr = this.QueryBuilder.IsCrossQueryWithAttr;
navigat.CrossQueryItems = this.QueryBuilder.CrossQueryItems;
navigat.Context = this.Context;
if (this.QueryBuilder.Includes == null) this.QueryBuilder.Includes = new List<object>();
this.QueryBuilder.Includes.Add(navigat);
@ -148,6 +164,8 @@ namespace SqlSugar
navigat.SelectR5 = SelectR5;
navigat.SelectR6 = SelectR6;
navigat.Expressions = expressions;
navigat.IsCrossQueryWithAttr = this.QueryBuilder.IsCrossQueryWithAttr;
navigat.CrossQueryItems = this.QueryBuilder.CrossQueryItems;
navigat.Context = this.Context;
if (this.QueryBuilder.Includes == null) this.QueryBuilder.Includes = new List<object>();
this.QueryBuilder.Includes.Add(navigat);
@ -170,6 +188,8 @@ namespace SqlSugar
navigat.SelectR6 = SelectR6;
navigat.SelectR7 = SelectR7;
navigat.Expressions = expressions;
navigat.IsCrossQueryWithAttr = this.QueryBuilder.IsCrossQueryWithAttr;
navigat.CrossQueryItems = this.QueryBuilder.CrossQueryItems;
navigat.Context = this.Context;
if (this.QueryBuilder.Includes == null) this.QueryBuilder.Includes = new List<object>();
this.QueryBuilder.Includes.Add(navigat);

View File

@ -3,6 +3,7 @@ using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
@ -11,6 +12,8 @@ namespace SqlSugar
public class NavigatManager<T>
{
public SqlSugarProvider Context { get; set; }
public bool IsCrossQueryWithAttr { get; set; }
public Dictionary<string, string> CrossQueryItems { get; set; }
public Func<ISugarQueryable<object>, List<object>> SelectR1 { get; set; }
public Func<ISugarQueryable<object>, List<object>> SelectR2 { get; set; }
public Func<ISugarQueryable<object>, List<object>> SelectR3 { get; set; }
@ -202,7 +205,9 @@ namespace SqlSugar
var bEntityInfo = this.Context.EntityMaintenance.GetEntityInfo(bEntity);
var bPkColumn = bEntityInfo.Columns.FirstOrDefault(it => it.IsPrimarykey);
Check.ExceptionEasy(bPkColumn==null, $"{bEntityInfo.EntityName} need primary key", $"{bEntityInfo.EntityName} 实体需要配置主键");
this.Context.InitMappingInfo(bEntity);
var bDb = this.Context;
bDb = GetCrossDatabase(bDb,bEntity);
bDb.InitMappingInfo(bEntity);
var listItemPkColumn = listItemEntity.Columns.Where(it => it.IsPrimarykey).FirstOrDefault();
Check.ExceptionEasy(listItemPkColumn == null, $"{listItemEntity.EntityName} need primary key", $"{listItemEntity.EntityName} 实体需要配置主键");
var ids = list.Select(it => it.GetType().GetProperty(listItemPkColumn.PropertyName).GetValue(it)).Select(it => it == null ? "null" : it).Distinct().ToList();
@ -217,7 +222,9 @@ namespace SqlSugar
FieldValue = String.Join(",", ids),
CSharpTypeName = aColumn.PropertyInfo.PropertyType.Name
}));
var queryable = this.Context.Queryable<object>();
var abDb = this.Context;
abDb = GetCrossDatabase(abDb, mappingEntity.Type);
var queryable = abDb.Queryable<object>();
var abids = queryable.AS(mappingEntity.DbTableName).Filter(mappingEntity.Type).Where(conditionalModels).Select<SugarAbMapping>($"{queryable.SqlBuilder.GetTranslationColumnName(aColumn.DbColumnName)} as aid,{queryable.SqlBuilder.GetTranslationColumnName(bColumn.DbColumnName)} as bid").ToList();
List<IConditionalModel> conditionalModels2 = new List<IConditionalModel>();
@ -229,7 +236,7 @@ namespace SqlSugar
CSharpTypeName = bColumn.PropertyInfo.PropertyType.Name
}));
var sql = GetWhereSql();
var bList = selector(this.Context.Queryable<object>().AS(bEntityInfo.DbTableName).Filter(bEntityInfo.Type).AddParameters(sql.Parameters).Where(conditionalModels2).WhereIF(sql.WhereString.HasValue(),sql.WhereString).Select(sql.SelectString).OrderByIF(sql.OrderByString.HasValue(),sql.OrderByString));
var bList = selector(bDb.Queryable<object>().AS(bEntityInfo.DbTableName).Filter(bEntityInfo.Type).AddParameters(sql.Parameters).Where(conditionalModels2).WhereIF(sql.WhereString.HasValue(),sql.WhereString).Select(sql.SelectString).OrderByIF(sql.OrderByString.HasValue(),sql.OrderByString));
if (bList.HasValue())
{
foreach (var listItem in list)
@ -309,8 +316,10 @@ namespace SqlSugar
var navColumn = listItemEntity.Columns.FirstOrDefault(it => it.PropertyName == navObjectNameColumnInfo.Navigat.Name);
Check.ExceptionEasy(navColumn == null, "OneToOne navigation configuration error", $"OneToOne导航配置错误 实体{ listItemEntity.EntityName } 不存在{navObjectNameColumnInfo.Navigat.Name}");
var navType = navObjectNamePropety.PropertyType;
var navEntityInfo = this.Context.EntityMaintenance.GetEntityInfo(navType);
this.Context.InitMappingInfo(navEntityInfo.Type);
var db = this.Context;
db = GetCrossDatabase(db,navType);
var navEntityInfo = db.EntityMaintenance.GetEntityInfo(navType);
db.InitMappingInfo(navEntityInfo.Type);
var navPkColumn = navEntityInfo.Columns.Where(it => it.IsPrimarykey).FirstOrDefault();
Check.ExceptionEasy(navPkColumn==null&& navObjectNameColumnInfo.Navigat.Name2==null, navEntityInfo.EntityName+ "need primarykey", navEntityInfo.EntityName + " 需要主键");
if (navObjectNameColumnInfo.Navigat.Name2.HasValue())
@ -329,7 +338,7 @@ namespace SqlSugar
if (list.Any()&&navObjectNamePropety.GetValue(list.First()) == null)
{
var sqlObj = GetWhereSql(navObjectNameColumnInfo.Navigat.Name);
var navList = selector(this.Context.Queryable<object>().Filter(navEntityInfo.Type).AS(navEntityInfo.DbTableName)
var navList = selector(db.Queryable<object>().Filter(navEntityInfo.Type).AS(navEntityInfo.DbTableName)
.WhereIF(navObjectNameColumnInfo.Navigat.WhereSql.HasValue(), navObjectNameColumnInfo.Navigat.WhereSql)
.WhereIF(sqlObj.WhereString.HasValue(),sqlObj.WhereString)
.AddParameters(sqlObj.Parameters).Where(conditionalModels));
@ -364,7 +373,9 @@ namespace SqlSugar
{
var navEntity = navObjectNameColumnInfo.PropertyInfo.PropertyType.GetGenericArguments()[0];
var navEntityInfo = this.Context.EntityMaintenance.GetEntityInfo(navEntity);
this.Context.InitMappingInfo(navEntityInfo.Type);
var childDb = this.Context;
childDb = GetCrossDatabase(childDb, navEntityInfo.Type);
childDb.InitMappingInfo(navEntityInfo.Type);
var navColumn = navEntityInfo.Columns.FirstOrDefault(it => it.PropertyName == navObjectNameColumnInfo.Navigat.Name);
Check.ExceptionEasy(navColumn == null, $"{navEntityInfo.EntityName} not found {navObjectNameColumnInfo.Navigat.Name} ", $"实体 {navEntityInfo.EntityName} 未找到导航配置列 {navObjectNameColumnInfo.Navigat.Name} ");
//var navType = navObjectNamePropety.PropertyType;
@ -388,7 +399,7 @@ namespace SqlSugar
if (list.Any() && navObjectNamePropety.GetValue(list.First()) == null)
{
var navList = selector(this.Context.Queryable<object>(sqlObj.TableShortName).AS(navEntityInfo.DbTableName).Filter(navEntityInfo.Type).AddParameters(sqlObj.Parameters).Where(conditionalModels).WhereIF(sqlObj.WhereString.HasValue(), sqlObj.WhereString).Select(sqlObj.SelectString).OrderByIF(sqlObj.OrderByString.HasValue(), sqlObj.OrderByString));
var navList = selector(childDb.Queryable<object>(sqlObj.TableShortName).AS(navEntityInfo.DbTableName).Filter(navEntityInfo.Type).AddParameters(sqlObj.Parameters).Where(conditionalModels).WhereIF(sqlObj.WhereString.HasValue(), sqlObj.WhereString).Select(sqlObj.SelectString).OrderByIF(sqlObj.OrderByString.HasValue(), sqlObj.OrderByString));
if (navList.HasValue())
{
//var setValue = navList
@ -689,6 +700,31 @@ namespace SqlSugar
}
}
private SqlSugarProvider GetCrossDatabase(SqlSugarProvider db, Type type)
{
if (IsCrossQueryWithAttr == false && this.CrossQueryItems == null)
{
return db;
}
else if (IsCrossQueryWithAttr)
{
var tenant = type.GetCustomAttribute<TenantAttribute>();
if (tenant != null)
{
return db.Root.GetConnection(tenant.configId);
}
else
{
return db;
}
}
else
{
return db;
}
}
private static void AppColumns(SqlInfo result, ISugarQueryable<object> queryable, string columnName)
{
var selectPkName = queryable.SqlBuilder.GetTranslationColumnName(columnName);

View File

@ -46,6 +46,19 @@ namespace SqlSugar
return this.Context.EntityMaintenance.GetEntityInfo<T>();
}
}
public ISugarQueryable<T> CrossQueryWithAttr()
{
this.QueryBuilder.IsCrossQueryWithAttr = true;
return this;
}
public ISugarQueryable<T> CrossQuery<Type>(string configId)
{
return this.CrossQuery(typeof(Type),configId);
}
public ISugarQueryable<T> CrossQuery(Type type, string configId)
{
return this;
}
public ISugarQueryable<T> IncludeLeftJoin(Expression<Func<T, object>> LeftObject)
{
MemberExpression memberExpression;
@ -3556,6 +3569,8 @@ namespace SqlSugar
asyncQueryableBuilder.IsSqlQuery = this.QueryBuilder.IsSqlQuery;
asyncQueryableBuilder.IsSqlQuerySelect = this.QueryBuilder.IsSqlQuerySelect;
asyncQueryableBuilder.OldSql = this.QueryBuilder.OldSql;
asyncQueryableBuilder.IsCrossQueryWithAttr = this.QueryBuilder.IsCrossQueryWithAttr;
asyncQueryableBuilder.CrossQueryItems = this.QueryBuilder.CrossQueryItems;
}
protected int SetCacheTime(int cacheDurationInSeconds)
{

View File

@ -33,6 +33,8 @@ namespace SqlSugar
#endregion
#region Splicing basic
public bool IsCrossQueryWithAttr { get; set; }
public Dictionary<string,string> CrossQueryItems { get; set; }
public bool IsSelectSingleFiledJson { get; set; }
public string TranLock { get; set; }
public bool IsDisableMasterSlaveSeparation { get; set; }

View File

@ -398,7 +398,7 @@ namespace SqlSugar
}
public IUpdateable<T> SetColumns(Expression<Func<T, object>> filedNameExpression, object fieldValue)
{
var name= UpdateBuilder.GetExpressionValue(filedNameExpression,ResolveExpressType.FieldSingle).GetString();
var name= UpdateBuilder.GetExpressionValue(filedNameExpression,ResolveExpressType.WhereSingle).GetString();
name = UpdateBuilder.Builder.GetNoTranslationColumnName(name);
return SetColumns(name, fieldValue);
}

View File

@ -19,6 +19,9 @@ namespace SqlSugar
ISugarQueryable<T> AS<T2>(string tableName);
ISugarQueryable<T> AS(string tableName);
ISugarQueryable<T> With(string withString);
ISugarQueryable<T> CrossQueryWithAttr();
ISugarQueryable<T> CrossQuery<Type>(string configId);
ISugarQueryable<T> CrossQuery(Type type ,string configId);
ISugarQueryable<T> IncludeLeftJoin(Expression<Func<T, object>> LeftObject);
ISugarQueryable<T, T2> LeftJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression);
ISugarQueryable<T, T2> InnerJoin<T2>(ISugarQueryable<T2> joinQueryable, Expression<Func<T, T2, bool>> joinExpression);

View File

@ -795,6 +795,7 @@ namespace SqlSugar
{
db.Context.Ado.BeginTran();
}
db.Context.Root = this;
return db.Context;
}