123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- using Ant.Extensions;
- using Ant.DbExpressions;
- using Ant.Descriptors;
- using Ant.Query.Mapping;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Linq.Expressions;
- using System.Reflection;
- using Ant.Utility;
- using Ant.Common;
- namespace Ant.Query
- {
- public interface IMappingObjectExpression
- {
- IObjectActivatorCreator GenarateObjectActivatorCreator(DbSqlQueryExpression sqlQuery);
- IMappingObjectExpression ToNewObjectExpression(DbSqlQueryExpression sqlQuery, DbTable table);
- void AddConstructorParameter(ParameterInfo p, DbExpression exp);
- void AddConstructorEntityParameter(ParameterInfo p, IMappingObjectExpression exp);
- void AddMemberExpression(MemberInfo p, DbExpression exp);
- void AddNavMemberExpression(MemberInfo p, IMappingObjectExpression exp);
- DbExpression GetMemberExpression(MemberInfo memberInfo);
- IMappingObjectExpression GetNavMemberExpression(MemberInfo memberInfo);
- DbExpression GetDbExpression(MemberExpression memberExpressionDeriveParameter);
- IMappingObjectExpression GetNavMemberExpression(MemberExpression exp);
- void SetNullChecking(DbExpression exp);
- }
- public static class MappingObjectExpressionHelper
- {
- public static DbExpression TryGetOrAddNullChecking(DbSqlQueryExpression sqlQuery, DbTable table, DbExpression exp)
- {
- if (exp == null)
- return null;
- List<DbColumnSegment> columnList = sqlQuery.ColumnSegments;
- DbColumnSegment columnSeg = null;
- columnSeg = columnList.Where(a => DbExpressionEqualityComparer.EqualsCompare(a.Body, exp)).FirstOrDefault();
- if (columnSeg == null)
- {
- string alias = OrmUtils.GenerateUniqueColumnAlias(sqlQuery);
- columnSeg = new DbColumnSegment(exp, alias);
- columnList.Add(columnSeg);
- }
- DbColumnAccessExpression cae = new DbColumnAccessExpression(columnSeg.Body.Type, table, columnSeg.Alias);
- return cae;
- }
- public static int? TryGetOrAddColumn(DbSqlQueryExpression sqlQuery, DbExpression exp, string addDefaultAlias = UtilConstants.DefaultColumnAlias)
- {
- if (exp == null)
- return null;
- List<DbColumnSegment> columnList = sqlQuery.ColumnSegments;
- DbColumnSegment columnSeg = null;
- int? ordinal = null;
- for (int i = 0; i < columnList.Count; i++)
- {
- var item = columnList[i];
- if (DbExpressionEqualityComparer.EqualsCompare(item.Body, exp))
- {
- ordinal = i;
- columnSeg = item;
- break;
- }
- }
- if (ordinal == null)
- {
- string alias = OrmUtils.GenerateUniqueColumnAlias(sqlQuery, addDefaultAlias);
- columnSeg = new DbColumnSegment(exp, alias);
- columnList.Add(columnSeg);
- ordinal = columnList.Count - 1;
- }
- return ordinal.Value;
- }
- /// <summary>
- /// 获取表达式Select中显示的列名
- /// </summary>
- /// <param name="sqlQuery"></param>
- /// <param name="table"></param>
- /// <param name="exp"></param>
- /// <param name="defaultAlias"></param>
- /// <returns></returns>
- public static DbColumnAccessExpression ParseColumnAccessExpression(DbSqlQueryExpression sqlQuery, DbTable table, DbExpression exp, string defaultAlias = UtilConstants.DefaultColumnAlias)
- {
- string alias = OrmUtils.GenerateUniqueColumnAlias(sqlQuery, defaultAlias);
- DbColumnSegment columnSeg = new DbColumnSegment(exp, alias);
- sqlQuery.ColumnSegments.Add(columnSeg);
- DbColumnAccessExpression cae = new DbColumnAccessExpression(exp.Type, table, alias);
- return cae;
- }
- }
- }
|