MappingFieldsHelper.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace SqlSugar
  9. {
  10. internal class MappingFieldsHelper<T>
  11. {
  12. public SqlSugarProvider Context { get; set; }
  13. public EntityInfo NavEntity { get; set; }
  14. public EntityInfo RootEntity { get; set; }
  15. public MappingFieldsInfo GetMappings(Expression thisFiled, Expression mappingFiled)
  16. {
  17. MappingFieldsInfo mappingFields=new MappingFieldsInfo();
  18. var pkName = "";
  19. if ((mappingFiled as LambdaExpression).Body is UnaryExpression)
  20. {
  21. pkName = (((mappingFiled as LambdaExpression).Body as UnaryExpression).Operand as MemberExpression).Member.Name;
  22. }
  23. else
  24. {
  25. pkName = ((mappingFiled as LambdaExpression).Body as MemberExpression).Member.Name;
  26. }
  27. return mappingFields;
  28. }
  29. public List<IConditionalModel> GetMppingSql(List<object> list, List<MappingFieldsExpression> mappingFieldsExpressions)
  30. {
  31. List<IConditionalModel> conditionalModels = new List<IConditionalModel>();
  32. foreach (var model in list)
  33. {
  34. var clist = new List<KeyValuePair<WhereType, ConditionalModel>>();
  35. var i = 0;
  36. foreach (var item in mappingFieldsExpressions)
  37. {
  38. InitMappingFieldsExpression(item);
  39. clist.Add(new KeyValuePair<WhereType, ConditionalModel>(i==0?WhereType.Or: WhereType.And, new ConditionalModel()
  40. {
  41. FieldName = item.LeftEntityColumn.DbColumnName,
  42. ConditionalType = ConditionalType.Equal,
  43. FieldValue = item.RightEntityColumn.PropertyInfo.GetValue(model).ObjToString(),
  44. CSharpTypeName =UtilMethods.GetUnderType(item.RightEntityColumn.PropertyInfo.PropertyType).Name
  45. }));
  46. i++;
  47. }
  48. conditionalModels.Add(new ConditionalCollections() {
  49. ConditionalList= clist
  50. });
  51. }
  52. return conditionalModels;
  53. }
  54. public void SetChildList(EntityColumnInfo navColumnInfo,object item,List<object> list, List<MappingFieldsExpression> mappingFieldsExpressions)
  55. {
  56. if (item != null)
  57. {
  58. //var expable =Expressionable.Create<object>();
  59. List<object> setList = GetSetList(item, list, mappingFieldsExpressions);
  60. //navColumnInfo.PropertyInfo.SetValue();
  61. var instance = Activator.CreateInstance(navColumnInfo.PropertyInfo.PropertyType, true);
  62. var ilist = instance as IList;
  63. foreach (var value in setList)
  64. {
  65. ilist.Add(value);
  66. }
  67. navColumnInfo.PropertyInfo.SetValue(item, ilist);
  68. }
  69. }
  70. public void SetChildItem(EntityColumnInfo navColumnInfo, object item, List<object> list, List<MappingFieldsExpression> mappingFieldsExpressions)
  71. {
  72. if (item != null)
  73. {
  74. //var expable =Expressionable.Create<object>();
  75. List<object> setList = GetSetList(item, list, mappingFieldsExpressions);
  76. //navColumnInfo.PropertyInfo.SetValue();
  77. var instance = Activator.CreateInstance(navColumnInfo.PropertyInfo.PropertyType, true);
  78. var ilist = instance as IList;
  79. foreach (var value in setList)
  80. {
  81. navColumnInfo.PropertyInfo.SetValue(item, value);
  82. }
  83. }
  84. }
  85. public List<object> GetSetList(object item, List<object> list, List<MappingFieldsExpression> mappingFieldsExpressions)
  86. {
  87. foreach (var field in mappingFieldsExpressions)
  88. {
  89. InitMappingFieldsExpression(field);
  90. }
  91. var setList = new List<object>();
  92. var count = mappingFieldsExpressions.Count;
  93. if (count == 1)
  94. {
  95. setList = list.Where(it => GetWhereByIndex(item, mappingFieldsExpressions, it, 0)).ToList();
  96. }
  97. else if (count == 2)
  98. {
  99. setList = list.Where(it =>
  100. GetWhereByIndex(item, mappingFieldsExpressions, it, 0) &&
  101. GetWhereByIndex(item, mappingFieldsExpressions, it, 1)
  102. ).ToList();
  103. }
  104. else if (count == 3)
  105. {
  106. setList = list.Where(it =>
  107. GetWhereByIndex(item, mappingFieldsExpressions, it, 0) &&
  108. GetWhereByIndex(item, mappingFieldsExpressions, it, 1) &&
  109. GetWhereByIndex(item, mappingFieldsExpressions, it, 2)
  110. ).ToList();
  111. }
  112. else if (count == 4)
  113. {
  114. setList = list.Where(it =>
  115. GetWhereByIndex(item, mappingFieldsExpressions, it, 0) &&
  116. GetWhereByIndex(item, mappingFieldsExpressions, it, 1) &&
  117. GetWhereByIndex(item, mappingFieldsExpressions, it, 2) &&
  118. GetWhereByIndex(item, mappingFieldsExpressions, it, 3)
  119. ).ToList();
  120. }
  121. else if (count == 5)
  122. {
  123. setList = list.Where(it =>
  124. GetWhereByIndex(item, mappingFieldsExpressions, it, 0) &&
  125. GetWhereByIndex(item, mappingFieldsExpressions, it, 1) &&
  126. GetWhereByIndex(item, mappingFieldsExpressions, it, 2) &&
  127. GetWhereByIndex(item, mappingFieldsExpressions, it, 3) &&
  128. GetWhereByIndex(item, mappingFieldsExpressions, it, 4)
  129. ).ToList();
  130. }
  131. else
  132. {
  133. Check.ExceptionEasy("MappingField max value is 5", "MappingField最大数量不能超过5");
  134. }
  135. return setList;
  136. }
  137. private static bool GetWhereByIndex(object item, List<MappingFieldsExpression> mappingFieldsExpressions, object it,int index)
  138. {
  139. var left = mappingFieldsExpressions[index].LeftEntityColumn.PropertyInfo.GetValue(it).ObjToString();
  140. var right= mappingFieldsExpressions[index].RightEntityColumn.PropertyInfo.GetValue(item).ObjToString(); ;
  141. return left == right;
  142. }
  143. private void InitMappingFieldsExpression(MappingFieldsExpression item)
  144. {
  145. var leftName = item.LeftName;
  146. var rightName = item.RightName;
  147. if (item.LeftEntityColumn == null)
  148. {
  149. item.LeftEntityColumn = this.NavEntity.Columns.FirstOrDefault(it => it.PropertyName == leftName);
  150. }
  151. if (item.RightEntityColumn == null && this.Context != null)
  152. {
  153. if (item.RightColumnExpression is LambdaExpression)
  154. {
  155. var body=(item.RightColumnExpression as LambdaExpression).Body;
  156. if (body is UnaryExpression)
  157. {
  158. body = ((UnaryExpression)body).Operand;
  159. }
  160. if (body is MemberExpression)
  161. {
  162. var exp=(body as MemberExpression).Expression;
  163. if (exp.NodeType == ExpressionType.Parameter)
  164. {
  165. item.RightEntityColumn =this.Context.EntityMaintenance.GetEntityInfo(exp.Type).Columns.FirstOrDefault(it => it.PropertyName == rightName);
  166. }
  167. }
  168. }
  169. if (item.RightEntityColumn==null)
  170. item.RightEntityColumn = this.RootEntity.Columns.FirstOrDefault(it => it.PropertyName == rightName);
  171. }
  172. }
  173. }
  174. public class MappingFieldsInfo
  175. {
  176. public DbColumnInfo LeftColumn { get; set; }
  177. public DbColumnInfo RightColumn { get; set; }
  178. }
  179. public class MappingFieldsExpression
  180. {
  181. public Expression LeftColumnExpression { get; set; }
  182. public Expression RightColumnExpression { get; set; }
  183. public EntityColumnInfo LeftEntityColumn { get; set; }
  184. public EntityColumnInfo RightEntityColumn { get; set; }
  185. private string _LeftName;
  186. public string LeftName
  187. {
  188. get
  189. {
  190. if (_LeftName == null)
  191. {
  192. _LeftName = ExpressionTool.GetMemberName(this.LeftColumnExpression);
  193. }
  194. return _LeftName;
  195. }
  196. }
  197. private string _RightName;
  198. public string RightName
  199. {
  200. get
  201. {
  202. if (_RightName == null)
  203. {
  204. _RightName = ExpressionTool.GetMemberName(this.RightColumnExpression);
  205. }
  206. return _RightName;
  207. }
  208. }
  209. }
  210. }