Crosss database query

This commit is contained in:
sunkaixuan 2022-10-04 20:41:09 +08:00
parent 1a1cab11d5
commit c35b7706b7
6 changed files with 73 additions and 3 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; }
@ -309,8 +312,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 +334,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));
@ -360,6 +365,30 @@ 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 void OneToMany(List<object> list, Func<ISugarQueryable<object>, List<object>> selector, EntityInfo listItemEntity, System.Reflection.PropertyInfo navObjectNamePropety, EntityColumnInfo navObjectNameColumnInfo)
{
var navEntity = navObjectNameColumnInfo.PropertyInfo.PropertyType.GetGenericArguments()[0];

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

@ -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;
}