/// <inheritdoc /> public WhereExpression GenerateWhereCondition(Expression whereExpression) { Check.NotNull(whereExpression, nameof(whereExpression)); LinqParameters = new Parameters(); LinqStringBuilder = new StringBuilder(); MemberExpressionStack.Clear(); Visit(whereExpression); return(new WhereExpression(LinqStringBuilder.ToString(), LinqParameters.GetParams())); }
/// <summary> /// Visits the member. /// </summary> /// <param name="expression">The expression.</param> /// <exception cref="System.NotSupportedException">If the member type is not supported.</exception> protected override Expression VisitMember(MemberExpression expression) { if (expression.Expression != null && (expression.Expression.NodeType == ExpressionType.Parameter || expression.Expression.NodeType == ExpressionType.Convert)) { AppendMemberColumnName(expression); return(expression); } MemberExpressionStack.Push(expression); Expression result = base.VisitMember(expression); if (PreviousMemberExpression == expression) { MemberExpressionStack.Pop(); } return(result); }
/// <summary> /// Generates the SQL from expression. /// </summary> /// <param name="expression">The expression.</param> /// <returns>SQL select command text.</returns> public virtual QueryInfo GenerateSql(Expression expression) { Check.NotNull(expression, nameof(expression)); _wasAny = false; _sqlBuilder = new StringBuilder(); _top = 0; _topPosition = 0; _skip = 0; _columnsPosition = 0; LinqParameters = new Parameters(); Orders.Clear(); MemberExpressionStack.Clear(); Visit(expression); CheckSkip(); AddOrderBy(); AddAnyMethod(); AddLimitAndOffset(); return(new QueryInfo(SqlBuilder.ToString(), CreateQueryReader())); }
/// <summary> /// Returns value of constant expression <paramref name="expression"/>. /// </summary> /// <param name="expression">Expression.</param> /// <returns>Value of the <paramref name="expression"/>.</returns> protected object GetConstantExpressionValue(ConstantExpression expression) { object val = expression.Value; MemberExpression prevNode; while ((prevNode = PreviousMemberExpression) != null) { if (prevNode.Member is FieldInfo fi) { val = fi.GetValue(val); } else if (prevNode.Member is PropertyInfo pi) { val = pi.GetValue(val); } else { throw new NotSupportedException( string.Format(Resources.Error_CannotGetValueOfConstantExpression, expression)); } MemberExpressionStack.Pop(); } return(val); }