IMappingObjectExpression.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using Ant.Extensions;
  2. using Ant.DbExpressions;
  3. using Ant.Descriptors;
  4. using Ant.Query.Mapping;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Linq.Expressions;
  9. using System.Reflection;
  10. using Ant.Utility;
  11. using Ant.Common;
  12. namespace Ant.Query
  13. {
  14. public interface IMappingObjectExpression
  15. {
  16. IObjectActivatorCreator GenarateObjectActivatorCreator(DbSqlQueryExpression sqlQuery);
  17. IMappingObjectExpression ToNewObjectExpression(DbSqlQueryExpression sqlQuery, DbTable table);
  18. void AddConstructorParameter(ParameterInfo p, DbExpression exp);
  19. void AddConstructorEntityParameter(ParameterInfo p, IMappingObjectExpression exp);
  20. void AddMemberExpression(MemberInfo p, DbExpression exp);
  21. void AddNavMemberExpression(MemberInfo p, IMappingObjectExpression exp);
  22. DbExpression GetMemberExpression(MemberInfo memberInfo);
  23. IMappingObjectExpression GetNavMemberExpression(MemberInfo memberInfo);
  24. DbExpression GetDbExpression(MemberExpression memberExpressionDeriveParameter);
  25. IMappingObjectExpression GetNavMemberExpression(MemberExpression exp);
  26. void SetNullChecking(DbExpression exp);
  27. }
  28. public static class MappingObjectExpressionHelper
  29. {
  30. public static DbExpression TryGetOrAddNullChecking(DbSqlQueryExpression sqlQuery, DbTable table, DbExpression exp)
  31. {
  32. if (exp == null)
  33. return null;
  34. List<DbColumnSegment> columnList = sqlQuery.ColumnSegments;
  35. DbColumnSegment columnSeg = null;
  36. columnSeg = columnList.Where(a => DbExpressionEqualityComparer.EqualsCompare(a.Body, exp)).FirstOrDefault();
  37. if (columnSeg == null)
  38. {
  39. string alias = OrmUtils.GenerateUniqueColumnAlias(sqlQuery);
  40. columnSeg = new DbColumnSegment(exp, alias);
  41. columnList.Add(columnSeg);
  42. }
  43. DbColumnAccessExpression cae = new DbColumnAccessExpression(columnSeg.Body.Type, table, columnSeg.Alias);
  44. return cae;
  45. }
  46. public static int? TryGetOrAddColumn(DbSqlQueryExpression sqlQuery, DbExpression exp, string addDefaultAlias = UtilConstants.DefaultColumnAlias)
  47. {
  48. if (exp == null)
  49. return null;
  50. List<DbColumnSegment> columnList = sqlQuery.ColumnSegments;
  51. DbColumnSegment columnSeg = null;
  52. int? ordinal = null;
  53. for (int i = 0; i < columnList.Count; i++)
  54. {
  55. var item = columnList[i];
  56. if (DbExpressionEqualityComparer.EqualsCompare(item.Body, exp))
  57. {
  58. ordinal = i;
  59. columnSeg = item;
  60. break;
  61. }
  62. }
  63. if (ordinal == null)
  64. {
  65. string alias = OrmUtils.GenerateUniqueColumnAlias(sqlQuery, addDefaultAlias);
  66. columnSeg = new DbColumnSegment(exp, alias);
  67. columnList.Add(columnSeg);
  68. ordinal = columnList.Count - 1;
  69. }
  70. return ordinal.Value;
  71. }
  72. /// <summary>
  73. /// 获取表达式Select中显示的列名
  74. /// </summary>
  75. /// <param name="sqlQuery"></param>
  76. /// <param name="table"></param>
  77. /// <param name="exp"></param>
  78. /// <param name="defaultAlias"></param>
  79. /// <returns></returns>
  80. public static DbColumnAccessExpression ParseColumnAccessExpression(DbSqlQueryExpression sqlQuery, DbTable table, DbExpression exp, string defaultAlias = UtilConstants.DefaultColumnAlias)
  81. {
  82. string alias = OrmUtils.GenerateUniqueColumnAlias(sqlQuery, defaultAlias);
  83. DbColumnSegment columnSeg = new DbColumnSegment(exp, alias);
  84. sqlQuery.ColumnSegments.Add(columnSeg);
  85. DbColumnAccessExpression cae = new DbColumnAccessExpression(exp.Type, table, alias);
  86. return cae;
  87. }
  88. }
  89. }