コード例 #1
0
		public virtual IParsedLambda Parse(OrderByExpression[] orderByExpressions)
		{
			Ensure.That(orderByExpressions, "orderByExpressions").HasItems();

			var nodesContainer = new NodesCollection();
			foreach (var orderByExpression in orderByExpressions.Where(e => e != null))
			{
				var memberExpression = orderByExpression.InnerLambdaExpression.Body.GetRightMostMember();
                if (memberExpression == null)
                    throw new SisoDbException(ExceptionMessages.OrderByExpressionDoesNotTargetMember.Inject(orderByExpression.ToString()));

				var callExpression = (orderByExpression.InnerLambdaExpression.Body is UnaryExpression)
                    ? ((UnaryExpression)orderByExpression.InnerLambdaExpression.Body).Operand as MethodCallExpression
					: orderByExpression.InnerLambdaExpression.Body as MethodCallExpression;
				
				if (callExpression != null)
					throw new SisoDbException(ExceptionMessages.OrderByParser_UnsupportedMethodForSortingDirection);

				var memberType = memberExpression.Type;
				if (memberType.IsEnumerableType())
					memberType = memberType.GetEnumerableElementType();

				var sortDirection = orderByExpression is OrderByAscExpression ? SortDirections.Asc : SortDirections.Desc;
			    var memberPath = memberExpression.ToPath();
			    var sortingNode = new SortingNode(memberPath, memberType, DataTypeConverter.Convert(memberType, memberPath), sortDirection);
				nodesContainer.AddNode(sortingNode);
			}

			return new ParsedLambda(nodesContainer.ToArray());
		}
コード例 #2
0
        public IParsedLambda Parse(string includedStructureSetName, LambdaExpression[] includeExpressions)
        {
			Ensure.That(includedStructureSetName, "includedStructureSetName").IsNotNullOrWhiteSpace();
            Ensure.That(includeExpressions, "includeExpressions").HasItems();

            var nodes = new NodesCollection();

            foreach (var includeExpression in includeExpressions)
            {
                var memberExpression = includeExpression.GetRightMostMember();
                var idReferencePath = memberExpression.ToPath();
                var objectReferencePath = BuildObjectReferencePath(idReferencePath);

                nodes.AddNode(
                    new IncludeNode(includedStructureSetName, idReferencePath, objectReferencePath, memberExpression.Type));    
            }

            return new ParsedLambda(nodes.ToArray());
        }
コード例 #3
0
        public virtual IParsedLambda Parse(string includedStructureSetName, LambdaExpression[] includeExpressions)
        {
			Ensure.That(includedStructureSetName, "includedStructureSetName").IsNotNullOrWhiteSpace();
            Ensure.That(includeExpressions, "includeExpressions").HasItems();

            var nodes = new NodesCollection();

            foreach (var includeExpression in includeExpressions)
            {
                var memberExpression = includeExpression.GetRightMostMember();
                if (memberExpression == null)
                    throw new SisoDbException(ExceptionMessages.IncludeExpressionDoesNotTargetMember.Inject(includeExpression.ToString()));

                var idReferencePath = memberExpression.ToPath();
                var objectReferencePath = BuildObjectReferencePath(idReferencePath);

                nodes.AddNode(new IncludeNode(
                    includedStructureSetName, idReferencePath, objectReferencePath, memberExpression.Type, DataTypeConverter.Convert(memberExpression.Type, idReferencePath)));    
            }

            return new ParsedLambda(nodes.ToArray());
        }
コード例 #4
0
        protected virtual IParsedLambda CreateParsedLambda()
        {
            //PERF: This ugly processing of nodes for boht transformers in one loop is for performance. Perhaps move bach to older cleaner solution
            var nullableNodeTransformer = new NullableNodeTransformer();
            var boolNodeTransformer = new BoolNodeTransformer();

            var newNodes = new NodesCollection();
            var maxIndex = Nodes.Count;
            for (var i = 0; i < Nodes.Count; i++)
            {
                var nullableNodes = nullableNodeTransformer.Transform(maxIndex, ref i, Nodes[i], Nodes);
                var merged = nullableNodes.MergeWith(Nodes.Skip(i + 1)).ToArray();
                var maxIndexInner = nullableNodes.Length;
                for (var iInner = 0; iInner < maxIndexInner; iInner++)
                {
                    var boolNodes = boolNodeTransformer.Transform(maxIndexInner, ref iInner, merged[iInner], new NodesCollection(merged));
                    newNodes.AddNodes(boolNodes);
                }
            }

            return new ParsedLambda(newNodes.ToArray());
        }