123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- 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;
- namespace Ant.Query
- {
- public class MappingObjectExpression : IMappingObjectExpression
- {
- public MappingObjectExpression(ConstructorInfo constructor)
- : this(EntityConstructorDescriptor.GetInstance(constructor))
- {
- }
- public MappingObjectExpression(EntityConstructorDescriptor constructorDescriptor)
- {
- this.ConstructorDescriptor = constructorDescriptor;
- this.ConstructorParameters = new Dictionary<ParameterInfo, DbExpression>();
- this.ConstructorEntityParameters = new Dictionary<ParameterInfo, IMappingObjectExpression>();
- this.SelectedMembers = new Dictionary<MemberInfo, DbExpression>();
- this.SubResultEntities = new Dictionary<MemberInfo, IMappingObjectExpression>();
- }
- public DbExpression PrimaryKey { get; set; }
- public DbExpression NullChecking { get; set; }
- /// <summary>
- /// 返回类型
- /// </summary>
- public EntityConstructorDescriptor ConstructorDescriptor { get; private set; }
- public Dictionary<ParameterInfo, DbExpression> ConstructorParameters { get; private set; }
- public Dictionary<ParameterInfo, IMappingObjectExpression> ConstructorEntityParameters { get; private set; }
- public Dictionary<MemberInfo, DbExpression> SelectedMembers { get; protected set; }
- public Dictionary<MemberInfo, IMappingObjectExpression> SubResultEntities { get; protected set; }
- public void AddConstructorParameter(ParameterInfo p, DbExpression exp)
- {
- this.ConstructorParameters.Add(p, exp);
- }
- public void AddConstructorEntityParameter(ParameterInfo p, IMappingObjectExpression exp)
- {
- this.ConstructorEntityParameters.Add(p, exp);
- }
- public void AddMemberExpression(MemberInfo m, DbExpression exp)
- {
- this.SelectedMembers.Add(m, exp);
- }
- public void AddNavMemberExpression(MemberInfo p, IMappingObjectExpression exp)
- {
- this.SubResultEntities.Add(p, exp);
- }
- /// <summary>
- /// 考虑匿名函数构造函数参数和其只读属性的对应
- /// </summary>
- /// <param name="memberInfo"></param>
- /// <returns></returns>
- public DbExpression GetMemberExpression(MemberInfo memberInfo)
- {
- DbExpression ret = null;
- if (!this.SelectedMembers.TryGetValue(memberInfo, out ret))
- {
- ParameterInfo p = null;
- if (!this.ConstructorDescriptor.MemberParameterMap.TryGetValue(memberInfo, out p))
- {
- return null;
- }
- if (!this.ConstructorParameters.TryGetValue(p, out ret))
- {
- return null;
- }
- }
- return ret;
- }
- public IMappingObjectExpression GetNavMemberExpression(MemberInfo memberInfo)
- {
- IMappingObjectExpression ret = null;
- if (!this.SubResultEntities.TryGetValue(memberInfo, out ret))
- {
- //从构造函数中查
- ParameterInfo p = null;
- if (!this.ConstructorDescriptor.MemberParameterMap.TryGetValue(memberInfo, out p))
- {
- return null;
- }
- if (!this.ConstructorEntityParameters.TryGetValue(p, out ret))
- {
- return null;
- }
- }
- return ret;
- }
- public DbExpression GetDbExpression(MemberExpression memberExpressionDeriveParameter)
- {
- Stack<MemberExpression> memberExpressions = ExpressionExtensions.Reverse(memberExpressionDeriveParameter);
- DbExpression ret = null;
- IMappingObjectExpression moe = this;
- foreach (MemberExpression memberExpression in memberExpressions)
- {
- MemberInfo member = memberExpression.Member;
- if (moe == null && ret != null)
- {
- /* a.F_DateTime.Value.Date */
- ret = DbExpression.MemberAccess(member, ret);
- continue;
- }
- DbExpression e = moe.GetMemberExpression(member);
- if (e == null)
- {
- moe = moe.GetNavMemberExpression(member);
- if (moe == null)
- {
- if (ret == null)
- {
- throw new Exception();
- }
- else
- {
- ret = DbExpression.MemberAccess(member, ret);
- continue;
- }
- }
- if (ret != null)
- throw new NotSupportedException(memberExpressionDeriveParameter.ToString());
- }
- else
- {
- if (ret != null)
- throw new NotSupportedException(memberExpressionDeriveParameter.ToString());
- ret = e;
- }
- }
- if (ret == null)
- throw new Exception(memberExpressionDeriveParameter.ToString());
- return ret;
- }
- public IMappingObjectExpression GetNavMemberExpression(MemberExpression memberExpressionDeriveParameter)
- {
- Stack<MemberExpression> memberExpressions = ExpressionExtensions.Reverse(memberExpressionDeriveParameter);
- if (memberExpressions.Count == 0)
- throw new Exception();
- IMappingObjectExpression ret = this;
- foreach (MemberExpression memberExpression in memberExpressions)
- {
- MemberInfo member = memberExpression.Member;
- ret = ret.GetNavMemberExpression(member);
- if (ret == null)
- {
- throw new NotSupportedException(memberExpressionDeriveParameter.ToString());
- }
- }
- return ret;
- }
- public IObjectActivatorCreator GenarateObjectActivatorCreator(DbSqlQueryExpression sqlQuery)
- {
- List<DbColumnSegment> columnList = sqlQuery.ColumnSegments;
- MappingEntity mappingEntity = new MappingEntity(this.ConstructorDescriptor);
- MappingObjectExpression mappingMembers = this;
- foreach (var kv in this.ConstructorParameters)
- {
- ParameterInfo pi = kv.Key;
- DbExpression exp = kv.Value;
- int ordinal;
- ordinal = MappingObjectExpressionHelper.TryGetOrAddColumn(sqlQuery, exp, pi.Name).Value;
- if (exp == this.NullChecking)
- mappingEntity.CheckNullOrdinal = ordinal;
- mappingEntity.ConstructorParameters.Add(pi, ordinal);
- }
- foreach (var kv in mappingMembers.ConstructorEntityParameters)
- {
- ParameterInfo pi = kv.Key;
- IMappingObjectExpression val = kv.Value;
- IObjectActivatorCreator navMappingMember = val.GenarateObjectActivatorCreator(sqlQuery);
- mappingEntity.ConstructorEntityParameters.Add(pi, navMappingMember);
- }
- foreach (var kv in mappingMembers.SelectedMembers)
- {
- MemberInfo member = kv.Key;
- DbExpression exp = kv.Value;
- int ordinal;
- ordinal = MappingObjectExpressionHelper.TryGetOrAddColumn(sqlQuery, exp, member.Name).Value;
- if (exp == this.NullChecking)
- mappingEntity.CheckNullOrdinal = ordinal;
- mappingEntity.Members.Add(member, ordinal);
- }
- foreach (var kv in mappingMembers.SubResultEntities)
- {
- MemberInfo member = kv.Key;
- IMappingObjectExpression val = kv.Value;
- IObjectActivatorCreator navMappingMember = val.GenarateObjectActivatorCreator(sqlQuery);
- mappingEntity.EntityMembers.Add(kv.Key, navMappingMember);
- }
- if (mappingEntity.CheckNullOrdinal == null)
- mappingEntity.CheckNullOrdinal = MappingObjectExpressionHelper.TryGetOrAddColumn(sqlQuery, this.NullChecking);
- return mappingEntity;
- }
- public IMappingObjectExpression ToNewObjectExpression(DbSqlQueryExpression sqlQuery, DbTable table)
- {
- List<DbColumnSegment> columnList = sqlQuery.ColumnSegments;
- MappingObjectExpression moe = new MappingObjectExpression(this.ConstructorDescriptor);
- MappingObjectExpression mappingMembers = this;
- foreach (var kv in this.ConstructorParameters)
- {
- ParameterInfo pi = kv.Key;
- DbExpression exp = kv.Value;
- DbColumnAccessExpression cae = null;
- cae = MappingObjectExpressionHelper.ParseColumnAccessExpression(sqlQuery, table, exp, pi.Name);
- moe.AddConstructorParameter(pi, cae);
- }
- foreach (var kv in mappingMembers.ConstructorEntityParameters)
- {
- ParameterInfo pi = kv.Key;
- IMappingObjectExpression val = kv.Value;
- IMappingObjectExpression navMappingMember = val.ToNewObjectExpression(sqlQuery, table);
- moe.AddConstructorEntityParameter(pi, navMappingMember);
- }
- foreach (var kv in mappingMembers.SelectedMembers)
- {
- MemberInfo member = kv.Key;
- DbExpression exp = kv.Value;
- DbColumnAccessExpression cae = null;
- cae = MappingObjectExpressionHelper.ParseColumnAccessExpression(sqlQuery, table, exp, member.Name);
- moe.AddMemberExpression(member, cae);
- if (exp == this.PrimaryKey)
- {
- moe.PrimaryKey = cae;
- if (this.NullChecking == this.PrimaryKey)
- moe.NullChecking = cae;
- }
- }
- foreach (var kv in mappingMembers.SubResultEntities)
- {
- MemberInfo member = kv.Key;
- IMappingObjectExpression val = kv.Value;
- IMappingObjectExpression navMappingMember = val.ToNewObjectExpression(sqlQuery, table);
- moe.AddNavMemberExpression(member, navMappingMember);
- }
- if (moe.NullChecking == null)
- moe.NullChecking = MappingObjectExpressionHelper.TryGetOrAddNullChecking(sqlQuery, table, this.NullChecking);
- return moe;
- }
- public void SetNullChecking(DbExpression exp)
- {
- if (this.NullChecking == null)
- {
- if (this.PrimaryKey != null)
- this.NullChecking = this.PrimaryKey;
- else
- this.NullChecking = exp;
- }
- foreach (var item in this.ConstructorEntityParameters.Values)
- {
- item.SetNullChecking(exp);
- }
- foreach (var item in this.SubResultEntities.Values)
- {
- item.SetNullChecking(exp);
- }
- }
- }
- }
|