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()); }
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); }
public void Ctor_WhenMemberPathStartsWithId_MemberNameIsTranslated() { var node = new SortingNode("IdTmp", typeof(int)); Assert.AreEqual("IdTmp", node.MemberPath); }
public void CTor_WhenNestedMemberPathEndsWithId_MemberNameIsTranslated() { var node = new SortingNode("Nested.TmpId", typeof(int)); Assert.AreEqual("Nested.TmpId", node.MemberPath); }
public void Ctor_WhenMemberPathIsStructureId_MemberNameIsTranslated() { var node = new SortingNode("StructureId", typeof(int)); Assert.AreEqual("StructureId", node.MemberPath); }