コード例 #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 void Ctor_WhenTypeIsSpecified_MemberTypeIsAssigned()
        {
            var node1 = new SortingNode("GOOFY", typeof (int));
            var node2 = new SortingNode("GOOFY", typeof(string));

            Assert.AreEqual(typeof(int), node1.MemberType);
            Assert.AreEqual(typeof(string), node2.MemberType);
        }
コード例 #3
0
        public void Ctor_WhenMemberPathStartsWithId_MemberNameIsTranslated()
        {
            var node = new SortingNode("IdTmp", typeof(int));

            Assert.AreEqual("IdTmp", node.MemberPath);
        }
コード例 #4
0
        public void CTor_WhenNestedMemberPathEndsWithId_MemberNameIsTranslated()
        {
            var node = new SortingNode("Nested.TmpId", typeof(int));

            Assert.AreEqual("Nested.TmpId", node.MemberPath);
        }
コード例 #5
0
        public void Ctor_WhenMemberPathIsStructureId_MemberNameIsTranslated()
        {
            var node = new SortingNode("StructureId", typeof(int));

            Assert.AreEqual("StructureId", node.MemberPath);
        }