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));
        }
Exemple #2
0
        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));
        }
Exemple #3
0
 public void BuildType_EmptyPropertyCollection_ThrowsException()
 {
     Assert.That(() => AnonymousTypeManager.BuildType(Enumerable.Empty <Property>()), Throws.ArgumentException);
 }
Exemple #4
0
 public void BuildType_NullPropertyCollection_ThrowsException()
 {
     Assert.That(() => AnonymousTypeManager.BuildType(null), Throws.InstanceOf <ArgumentNullException>());
 }