/// <summary> /// The visit order by clause. /// </summary> /// <param name="orderByClause"> /// The order by clause. /// </param> /// <param name="queryModel"> /// The query model. /// </param> /// <param name="index"> /// The index. /// </param> public override void VisitOrderByClause(OrderByClause orderByClause, QueryModel queryModel, int index) { foreach (Ordering ordering in orderByClause.Orderings) { MemberInfo member; Expression expression = null; StringBuilder path = new StringBuilder(); if (ordering.Expression is MemberExpression) { expression = ordering.Expression as MemberExpression; } else if (ordering.Expression is UnaryExpression) { expression = ordering.Expression as UnaryExpression; } else if (ordering.Expression is ConditionalExpression) { expression = (ordering.Expression as ConditionalExpression).IfFalse; while (expression is ConditionalExpression) { expression = (expression as ConditionalExpression).IfFalse; } } while (expression != null && expression.NodeType == ExpressionType.Convert) { expression = (expression as UnaryExpression).Operand; } MemberExpression memberExpression = expression as MemberExpression; while (memberExpression != null) { member = UtilsLcs.GetObjectPropertyValue(memberExpression, "Member"); memberExpression = memberExpression.Expression as MemberExpression; if (member == null) { break; } else if (member.Name == "Value") { continue; } if (path.Length > 0) { path.Insert(0, "."); } path.Insert(0, member.Name); } if (path.Length > 0) { AddColumnSort(path.ToString(), GetOrder(ordering.OrderingDirection)); } } VisitOrderings(orderByClause.Orderings, queryModel, orderByClause); }
/// <summary> /// The visit order by clause. /// </summary> /// <param name="orderByClause"> /// The order by clause. /// </param> /// <param name="queryModel"> /// The query model. /// </param> /// <param name="index"> /// The index. /// </param> public override void VisitOrderByClause(OrderByClause orderByClause, QueryModel queryModel, int index) { foreach (Ordering ordering in orderByClause.Orderings) { StringBuilder path = new StringBuilder(); MemberInfo member; MemberExpression expr = ordering.Expression as MemberExpression; if (expr == null) { ConditionalExpression conditionalExpr = ordering.Expression as ConditionalExpression; if (conditionalExpr == null) { continue; } UnaryExpression unaryExpr = conditionalExpr.IfFalse as UnaryExpression; if (unaryExpr != null) { if (unaryExpr.NodeType == ExpressionType.Convert) { expr = unaryExpr.Operand as MemberExpression; } } else { expr = conditionalExpr.IfFalse as MemberExpression; } } if (expr == null) { continue; } do { member = UtilsLcs.GetObjectPropertyValue(expr, "Member"); if (member == null) { break; } if (path.Length > 0) { path.Insert(0, "."); } path.Insert(0, member.Name); expr = expr.Expression as MemberExpression; } while (expr != null); if (member != null && path.Length > 0) { AddColumnSort(path.ToString(), GetOrder(ordering.OrderingDirection)); } } VisitOrderings(orderByClause.Orderings, queryModel, orderByClause); }
/// <summary> /// The get owner connect prop. /// </summary> /// <param name="fromExpr"> /// The from expr. /// </param> /// <returns> /// The <see cref="string[]"/>. /// </returns> public static string[] GetOwnerConnectProp(Expression fromExpr) { string res = SQLWhereLanguageDef.StormMainObjectKey; var memberExpr = fromExpr as MemberExpression; if (memberExpr != null) { Expression innerExpression = memberExpr.Expression; MemberInfo parentMember = UtilsLcs.GetObjectPropertyValue(innerExpression, "Member"); if (parentMember != null) { res = parentMember.Name; } } return(new[] { res }); }
public Expression Transform(Expression expression) { if (expression is MemberExpression) { var memberexp = expression as MemberExpression; if (memberexp.Expression is ConstantExpression) { switch (memberexp.Member.Name) { case "Minute": case "Day": case "Month": case "Year": case "Hour": case "Date": return(expression); } return(PartialEvaluatingExpressionTreeVisitor.EvaluateIndependentSubtrees(expression)); } var member = UtilsLcs.GetObjectPropertyValue(expression, "Member"); if (member.DeclaringType == typeof(DateTime)) { switch (member.Name) { case "Now": case "Date": case "Today": case "DayOfWeek": case "Day": case "Month": case "Year": case "Hour": case "Minute": case "TimeOfDay": return(expression); } } } // Может быть не к месту, но главное чтобы evaluate делался return(PartialEvaluatingExpressionTreeVisitor.EvaluateIndependentSubtrees(expression)); }