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 BuildType_PropertyCollectionContainingSingleProperty_GeneratesTypeCorrectly() { var properties = new[] { new Property { Type = typeof(string), Name = "TestProperty" } }; var type = AnonymousTypeManager.BuildType(properties); Assert.That(type, Is.Not.Null); Assert.That(type.Name, Is.EqualTo("TestProperty")); Assert.That(type.GetFields(BindingFlags.Instance | BindingFlags.Public).Length, Is.EqualTo(1)); }
public void BuildType_EmptyPropertyCollection_ThrowsException() { Assert.That(() => AnonymousTypeManager.BuildType(Enumerable.Empty <Property>()), Throws.ArgumentException); }
public void BuildType_NullPropertyCollection_ThrowsException() { Assert.That(() => AnonymousTypeManager.BuildType(null), Throws.InstanceOf <ArgumentNullException>()); }