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; }