You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
4.7 KiB
106 lines
4.7 KiB
3 weeks ago
|
using SqlSugar;
|
||
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Text;
|
||
|
using System.Linq;
|
||
|
namespace ReZero.SuperAPI
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Join
|
||
|
/// </summary>
|
||
|
public partial class QueryCommon : IDataService
|
||
|
{
|
||
|
private QueryMethodInfo Join(Type type, DataModel dataModel, QueryMethodInfo queryObject)
|
||
|
{
|
||
|
if (!IsAnyJoin(dataModel)) return queryObject;
|
||
|
int index = 0;
|
||
|
var joinInfoList = dataModel.JoinParameters ?? new List<DataModelJoinParameters>();
|
||
|
foreach (var item in joinInfoList)
|
||
|
{
|
||
|
index++;
|
||
|
var shortName = GetShortName(index);
|
||
|
var JoinType = EntityGeneratorManager.GetTypeAsync(item.JoinTableId).GetAwaiter().GetResult();
|
||
|
var onSql = GetJoinOnSql(type, item.OnList, shortName, joinInfoList);
|
||
|
queryObject = queryObject.AddJoinInfo(JoinType, shortName, onSql, item.JoinType);
|
||
|
}
|
||
|
return queryObject;
|
||
|
}
|
||
|
|
||
|
private string GetJoinOnSql(Type type, List<JoinParameter>? onList, string shortName, List<DataModelJoinParameters> joinInfoList)
|
||
|
{
|
||
|
string onSql = string.Empty;
|
||
|
List<IConditionalModel> conditionalModels = new List<IConditionalModel>();
|
||
|
StringBuilder sb = new StringBuilder();
|
||
|
var index = 0;
|
||
|
foreach (var item in onList ?? new List<JoinParameter>())
|
||
|
{
|
||
|
AppendJoinItem(type, joinInfoList, sb, index, item);
|
||
|
index++;
|
||
|
}
|
||
|
return sb.ToString();
|
||
|
}
|
||
|
|
||
|
private void AppendJoinItem(Type type, List<DataModelJoinParameters> joinInfoList, StringBuilder sb, int index, JoinParameter item)
|
||
|
{
|
||
|
var leftEntity = _sqlSugarClient!.EntityMaintenance.GetEntityInfo(GetLeftType(type, joinInfoList, item));
|
||
|
var rightEntity = _sqlSugarClient!.EntityMaintenance.GetEntityInfo(GetRightType(type, joinInfoList, item));
|
||
|
var leftName = GetLeftName(item,leftEntity);
|
||
|
var rightName = GetRightName(item,rightEntity);
|
||
|
switch (item.FieldOperator)
|
||
|
{
|
||
|
case FieldOperatorType.Equal:
|
||
|
sb.Append($"{(index == 0 ? "" : " AND ")} {leftName}={rightName} ");
|
||
|
break;
|
||
|
case FieldOperatorType.Like:
|
||
|
break;
|
||
|
case FieldOperatorType.GreaterThan:
|
||
|
break;
|
||
|
case FieldOperatorType.GreaterThanOrEqual:
|
||
|
break;
|
||
|
case FieldOperatorType.LessThan:
|
||
|
break;
|
||
|
case FieldOperatorType.LessThanOrEqual:
|
||
|
break;
|
||
|
case FieldOperatorType.In:
|
||
|
break;
|
||
|
case FieldOperatorType.NotIn:
|
||
|
break;
|
||
|
case FieldOperatorType.LikeLeft:
|
||
|
break;
|
||
|
case FieldOperatorType.LikeRight:
|
||
|
break;
|
||
|
case FieldOperatorType.NoEqual:
|
||
|
break;
|
||
|
case FieldOperatorType.NoLike:
|
||
|
break;
|
||
|
case FieldOperatorType.InLike:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static Type GetLeftType(Type type, List<DataModelJoinParameters> joinInfoList, JoinParameter item)
|
||
|
{
|
||
|
return item.LeftIndex == 0 ? type : EntityGeneratorManager.GetTypeAsync((joinInfoList[item.LeftIndex].JoinTableId)).GetAwaiter().GetResult();
|
||
|
}
|
||
|
private static Type GetRightType(Type type, List<DataModelJoinParameters> joinInfoList, JoinParameter item)
|
||
|
{
|
||
|
return item.RightIndex == 0 ? type : EntityGeneratorManager.GetTypeAsync((joinInfoList[item.RightIndex-1].JoinTableId)).GetAwaiter().GetResult();
|
||
|
}
|
||
|
private string GetRightName(JoinParameter item, EntityInfo rightEntity)
|
||
|
{
|
||
|
var name=rightEntity.Columns.FirstOrDefault(it => it.PropertyName == item.RightPropertyName).DbColumnName;
|
||
|
return _sqlBuilder!.GetTranslationColumnName(PubConst.Orm_TableDefaultPreName + item.RightIndex) + "." + _sqlBuilder!.GetTranslationColumnName(name);
|
||
|
}
|
||
|
|
||
|
private string GetLeftName(JoinParameter item, EntityInfo leftEntity)
|
||
|
{
|
||
|
var name = leftEntity.Columns.FirstOrDefault(it => it.PropertyName == item.LeftPropertyName).DbColumnName;
|
||
|
return _sqlBuilder!.GetTranslationColumnName(PubConst.Orm_TableDefaultPreName + item.LeftIndex) + "." + _sqlBuilder!.GetTranslationColumnName(name);
|
||
|
}
|
||
|
private static string GetShortName(int index)
|
||
|
{
|
||
|
return PubConst.Orm_TableDefaultPreName+ index;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|