sqlsugar/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/MappingFieldsHelper.cs

221 lines
9.0 KiB
C#
Raw Normal View History

2025-05-11 16:20:50 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace SqlSugar
{
internal class MappingFieldsHelper<T>
{
public SqlSugarProvider Context { get; set; }
public EntityInfo NavEntity { get; set; }
public EntityInfo RootEntity { get; set; }
public MappingFieldsInfo GetMappings(Expression thisFiled, Expression mappingFiled)
{
MappingFieldsInfo mappingFields=new MappingFieldsInfo();
var pkName = "";
if ((mappingFiled as LambdaExpression).Body is UnaryExpression)
{
pkName = (((mappingFiled as LambdaExpression).Body as UnaryExpression).Operand as MemberExpression).Member.Name;
}
else
{
pkName = ((mappingFiled as LambdaExpression).Body as MemberExpression).Member.Name;
}
return mappingFields;
}
public List<IConditionalModel> GetMppingSql(List<object> list, List<MappingFieldsExpression> mappingFieldsExpressions)
{
List<IConditionalModel> conditionalModels = new List<IConditionalModel>();
foreach (var model in list)
{
var clist = new List<KeyValuePair<WhereType, ConditionalModel>>();
var i = 0;
foreach (var item in mappingFieldsExpressions)
{
InitMappingFieldsExpression(item);
clist.Add(new KeyValuePair<WhereType, ConditionalModel>(i==0?WhereType.Or: WhereType.And, new ConditionalModel()
{
FieldName = item.LeftEntityColumn.DbColumnName,
ConditionalType = ConditionalType.Equal,
FieldValue = item.RightEntityColumn.PropertyInfo.GetValue(model).ObjToString(),
CSharpTypeName =UtilMethods.GetUnderType(item.RightEntityColumn.PropertyInfo.PropertyType).Name
}));
i++;
}
conditionalModels.Add(new ConditionalCollections() {
ConditionalList= clist
});
}
return conditionalModels;
}
public void SetChildList(EntityColumnInfo navColumnInfo,object item,List<object> list, List<MappingFieldsExpression> mappingFieldsExpressions)
{
if (item != null)
{
//var expable =Expressionable.Create<object>();
List<object> setList = GetSetList(item, list, mappingFieldsExpressions);
//navColumnInfo.PropertyInfo.SetValue();
var instance = Activator.CreateInstance(navColumnInfo.PropertyInfo.PropertyType, true);
var ilist = instance as IList;
foreach (var value in setList)
{
ilist.Add(value);
}
navColumnInfo.PropertyInfo.SetValue(item, ilist);
}
}
public void SetChildItem(EntityColumnInfo navColumnInfo, object item, List<object> list, List<MappingFieldsExpression> mappingFieldsExpressions)
{
if (item != null)
{
//var expable =Expressionable.Create<object>();
List<object> setList = GetSetList(item, list, mappingFieldsExpressions);
//navColumnInfo.PropertyInfo.SetValue();
var instance = Activator.CreateInstance(navColumnInfo.PropertyInfo.PropertyType, true);
var ilist = instance as IList;
foreach (var value in setList)
{
navColumnInfo.PropertyInfo.SetValue(item, value);
}
}
}
public List<object> GetSetList(object item, List<object> list, List<MappingFieldsExpression> mappingFieldsExpressions)
{
foreach (var field in mappingFieldsExpressions)
{
InitMappingFieldsExpression(field);
}
var setList = new List<object>();
var count = mappingFieldsExpressions.Count;
if (count == 1)
{
setList = list.Where(it => GetWhereByIndex(item, mappingFieldsExpressions, it, 0)).ToList();
}
else if (count == 2)
{
setList = list.Where(it =>
GetWhereByIndex(item, mappingFieldsExpressions, it, 0) &&
GetWhereByIndex(item, mappingFieldsExpressions, it, 1)
).ToList();
}
else if (count == 3)
{
setList = list.Where(it =>
GetWhereByIndex(item, mappingFieldsExpressions, it, 0) &&
GetWhereByIndex(item, mappingFieldsExpressions, it, 1) &&
GetWhereByIndex(item, mappingFieldsExpressions, it, 2)
).ToList();
}
else if (count == 4)
{
setList = list.Where(it =>
GetWhereByIndex(item, mappingFieldsExpressions, it, 0) &&
GetWhereByIndex(item, mappingFieldsExpressions, it, 1) &&
GetWhereByIndex(item, mappingFieldsExpressions, it, 2) &&
GetWhereByIndex(item, mappingFieldsExpressions, it, 3)
).ToList();
}
else if (count == 5)
{
setList = list.Where(it =>
GetWhereByIndex(item, mappingFieldsExpressions, it, 0) &&
GetWhereByIndex(item, mappingFieldsExpressions, it, 1) &&
GetWhereByIndex(item, mappingFieldsExpressions, it, 2) &&
GetWhereByIndex(item, mappingFieldsExpressions, it, 3) &&
GetWhereByIndex(item, mappingFieldsExpressions, it, 4)
).ToList();
}
else
{
Check.ExceptionEasy("MappingField max value is 5", "MappingField最大数量不能超过5");
}
return setList;
}
private static bool GetWhereByIndex(object item, List<MappingFieldsExpression> mappingFieldsExpressions, object it,int index)
{
var left = mappingFieldsExpressions[index].LeftEntityColumn.PropertyInfo.GetValue(it).ObjToString();
var right= mappingFieldsExpressions[index].RightEntityColumn.PropertyInfo.GetValue(item).ObjToString(); ;
return left == right;
}
private void InitMappingFieldsExpression(MappingFieldsExpression item)
{
var leftName = item.LeftName;
var rightName = item.RightName;
if (item.LeftEntityColumn == null)
{
item.LeftEntityColumn = this.NavEntity.Columns.FirstOrDefault(it => it.PropertyName == leftName);
}
if (item.RightEntityColumn == null && this.Context != null)
{
if (item.RightColumnExpression is LambdaExpression)
{
var body=(item.RightColumnExpression as LambdaExpression).Body;
if (body is UnaryExpression)
{
body = ((UnaryExpression)body).Operand;
}
if (body is MemberExpression)
{
var exp=(body as MemberExpression).Expression;
if (exp.NodeType == ExpressionType.Parameter)
{
item.RightEntityColumn =this.Context.EntityMaintenance.GetEntityInfo(exp.Type).Columns.FirstOrDefault(it => it.PropertyName == rightName);
}
}
}
if (item.RightEntityColumn==null)
item.RightEntityColumn = this.RootEntity.Columns.FirstOrDefault(it => it.PropertyName == rightName);
}
}
}
public class MappingFieldsInfo
{
public DbColumnInfo LeftColumn { get; set; }
public DbColumnInfo RightColumn { get; set; }
}
public class MappingFieldsExpression
{
public Expression LeftColumnExpression { get; set; }
public Expression RightColumnExpression { get; set; }
public EntityColumnInfo LeftEntityColumn { get; set; }
public EntityColumnInfo RightEntityColumn { get; set; }
private string _LeftName;
public string LeftName
{
get
{
if (_LeftName == null)
{
_LeftName = ExpressionTool.GetMemberName(this.LeftColumnExpression);
}
return _LeftName;
}
}
private string _RightName;
public string RightName
{
get
{
if (_RightName == null)
{
_RightName = ExpressionTool.GetMemberName(this.RightColumnExpression);
}
return _RightName;
}
}
}
}