示例#1
0
        /// <summary>
        /// Получить <see cref="LoadingCustomizationStruct"/> для указанного linq-выражения по представлению.
        /// </summary>
        /// <param name="queryExpression">Linq-выражение, по которому будет сформирован <see cref="LoadingCustomizationStruct"/>.</param>
        /// <param name="view">Представление, по которому будут зачитаны данные.</param>
        /// <param name="resolvingViews">Представления мастеров, необходимые для получения их детейлов, в случае динамических представлений. </param>
        /// <returns><see cref="LoadingCustomizationStruct"/>, полученный для указанного linq-выражения по представлению.</returns>
        public static LoadingCustomizationStruct GetLcs <Q>(Expression queryExpression, View view, IEnumerable <View> resolvingViews)
            where Q : IQueryModelVisitor
        {
            var queryModel = UtilsLcs.CreateQueryParser().GetParsedQuery(queryExpression);

            return(GetQueryModelVisitor <Q>(false, view, resolvingViews).GenerateLcs(queryModel));
        }
示例#2
0
        /// <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);
        }
示例#4
0
        /// <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 });
        }
示例#5
0
        /// <summary>
        /// Получить <see cref="LoadingCustomizationStruct"/> для указанного linq-выражения с динамически созданным представлением.
        /// </summary>
        /// <param name="queryExpression">Linq-выражение, по которому будет сформирован <see cref="LoadingCustomizationStruct"/>.</param>
        /// <param name="type">Тип объекта данных, для которого необходимо сформировать <see cref="LoadingCustomizationStruct"/>.</param>
        /// <returns><see cref="LoadingCustomizationStruct"/>, полученный для указанного linq-выражения с динамически созданным представлением.</returns>
        public static LoadingCustomizationStruct GetLcs <Q>(Expression queryExpression, Type type)
            where Q : IQueryModelVisitor
        {
            var queryModel = UtilsLcs.CreateQueryParser().GetParsedQuery(queryExpression);

            if (!type.IsSubclassOf(typeof(DataObject)))
            {
                throw new ArgumentException(string.Format("Тип \"{0}\" должен наследовать DataObject", type));
            }

            var view = new View
            {
                DefineClassType = type,
                Name            = string.Format("DynamicViewFor{0}", type.FullName)
            };

            return(GetQueryModelVisitor <Q>(true, view, null).GenerateLcs(queryModel));
        }
示例#6
0
        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));
        }