protected override SelectQueryPart VisitSelect(SelectQueryPart select)
        {
            var parameter = Expression.Parameter(_itemType, "select");

            var memberExpressions = select.Selectors
                                    .Select(selector => GetMemberAccessExpression(parameter, selector))
                                    .ToList();

            if (memberExpressions.Count > 1)
            {
                var properties = memberExpressions
                                 .Select(x => x.Member).Cast <PropertyInfo>()
                                 .Select(x => new Property
                {
                    Type = x.PropertyType,
                    Name = x.Name
                });

                var selectType = AnonymousTypeManager.BuildType(properties);

                var memberBindings = new List <MemberBinding>();

                foreach (var memberExpression in memberExpressions)
                {
                    var property = selectType.GetField(memberExpression.Member.Name);

                    var memberBinding = Expression.Bind(property, memberExpression);

                    memberBindings.Add(memberBinding);
                }

                var constructor = Expression.New(selectType);

                var initialization = Expression.MemberInit(constructor, memberBindings);

                var lambda = Expression.Lambda(initialization, false, parameter);

                _expression = Expression.Call(typeof(Queryable), "Select", new[] { _itemType, selectType }, _expression, lambda);
            }
            else if (memberExpressions.Count > 0)
            {
                var memberExpression = memberExpressions.Single();

                var selectType = memberExpression.Type;

                var lambda = Expression.Lambda(memberExpression, false, parameter);

                _expression = Expression.Call(typeof(Queryable), "Select", new[] { _itemType, selectType }, _expression, lambda);
            }

            return(base.VisitSelect(select));
        }
        public void ToString_TwoMembers_ReturnsCommaSeperatedString()
        {
            var selectQueryPart = new SelectQueryPart(FilterExpression.MemberAccess("TestString"), FilterExpression.MemberAccess("TestInt"));

            Assert.That(selectQueryPart.ToString(), Is.EqualTo("$select=TestString, TestInt"));
        }
        public void ToString_NoMembers_ReturnsEmptyString()
        {
            var selectQueryPart = new SelectQueryPart();

            Assert.That(selectQueryPart.ToString(), Is.EqualTo(String.Empty));
        }
 protected virtual SelectQueryPart VisitSelect(SelectQueryPart select)
 {
     return select;
 }
        public void ToString_TwoMembers_ReturnsCommaSeperatedString()
        {
            var selectQueryPart = new SelectQueryPart(FilterExpression.MemberAccess("TestString"), FilterExpression.MemberAccess("TestInt"));

            Assert.That(selectQueryPart.ToString(), Is.EqualTo("$select=TestString, TestInt"));
        }
        public void ToString_NoMembers_ReturnsEmptyString()
        {
            var selectQueryPart = new SelectQueryPart();

            Assert.That(selectQueryPart.ToString(), Is.EqualTo(String.Empty));
        }