public IObjectModel GetComplexMember(MemberExpression memberExpressionDeriveParameter) { Stack <MemberExpression> memberExpressions = ExpressionExtension.Reverse(memberExpressionDeriveParameter); if (memberExpressions.Count == 0) { throw new Exception(); } IObjectModel ret = this; foreach (MemberExpression memberExpression in memberExpressions) { MemberInfo member = memberExpression.Member; ret = ret.GetComplexMember(member); if (ret == null) { throw new NotSupportedException(memberExpressionDeriveParameter.ToString()); } } return(ret); }
public DbExpression GetDbExpression(MemberExpression memberExpressionDeriveFromParameter) { Stack <MemberExpression> memberExpressions = ExpressionExtension.Reverse(memberExpressionDeriveFromParameter); DbExpression ret = null; IObjectModel model = this; foreach (MemberExpression memberExpression in memberExpressions) { MemberInfo accessedMember = memberExpression.Member; if (model == null && ret != null) { /* a.F_DateTime.Value.Date */ ret = DbExpression.MemberAccess(accessedMember, ret); continue; } /* **.accessedMember */ DbExpression e = model.GetPrimitiveMember(accessedMember); if (e == null) { /* Indicate current accessed member is not mapping member, then try get complex member like 'a.Order' */ model = model.GetComplexMember(accessedMember); if (model == null) { if (ret == null) { /* * If run here,the member access expression must be like 'a.xx', * and member 'xx' is neither mapping member nor complex member,in this case,we not supported. */ throw new InvalidOperationException(memberExpressionDeriveFromParameter.ToString()); } else { /* Non mapping member is not found also, then convert linq MemberExpression to DbMemberExpression */ ret = DbExpression.MemberAccess(accessedMember, ret); continue; } } if (ret != null) { /* This case and case #110 will not appear in normal, if you meet,please email me([email protected]) or call 911 for help. */ throw new InvalidOperationException(memberExpressionDeriveFromParameter.ToString()); } } else { if (ret != null)//Case: #110 { throw new InvalidOperationException(memberExpressionDeriveFromParameter.ToString()); } ret = e; } } if (ret == null) { /* * If run here,the input argument 'memberExpressionDeriveFromParameter' expression must be like 'a.xx','a.**.xx','a.**.**.xx' ...and so on, * and the last accessed member 'xx' is not mapping member, in this case, we not supported too. */ throw new InvalidOperationException(memberExpressionDeriveFromParameter.ToString()); } return(ret); }