Ejemplo n.º 1
0
        private Expression CreateCrossJoin(
            Expression first,
            LambdaExpression collectionSelector,
            string firstName,
            string secondName)
        {
            Type firstType  = TypeHelper.GetElementType(first.Type);
            Type secondType = TypeHelper.GetElementType(collectionSelector.Body.Type);

            Dictionary <string, Type> resultTypeProps =
                new Dictionary <string, Type>
            {
                { firstName, firstType },
                { secondName, secondType }
            };

            // Create result selector
            Type resultType = DataRowFactory.Create(resultTypeProps);

            IKeyInfoHelper helper = new DataRowKeyInfoHelper(resultType);

            ParameterExpression firstParam  = Expression.Parameter(firstType);
            ParameterExpression secondParam = Expression.Parameter(secondType);

            LambdaExpression resultSelector =
                Expression.Lambda(
                    helper.CreateKeyFactoryExpression(firstParam, secondParam),
                    firstParam,
                    secondParam);

            return(queryMethodExpressionBuilder.SelectMany(
                       first,
                       collectionSelector,
                       resultSelector));
        }
Ejemplo n.º 2
0
        private static Expression CreateDataRowSelector(
            Expression body,
            Expression[] memberSelectors)
        {
            Dictionary <string, Type> members = new Dictionary <string, Type>();

            int index = 0;

            foreach (var selector in memberSelectors)
            {
                members.Add(string.Format("Item{0:D2}", index), selector.Type);
                index++;
            }

            Type rowType = DataRowFactory.Create(members);

            var helper = new DataRowKeyInfoHelper(rowType);

            body = helper.CreateKeyFactoryExpression(memberSelectors);

            return(body);
        }
Ejemplo n.º 3
0
        private Expression CreateSelector(Expression[] arguments, Type resultType)
        {
            if (resultType.IsArray)
            {
                Expression array =
                    Expression.NewArrayInit(
                        resultType.GetElementType(),
                        arguments);

                Type listType = typeof(List <>).MakeGenericType(resultType.GetElementType());

                var constr = listType
                             .GetConstructors()
                             .Where(c =>
                                    c.GetParameters().Length == 1 &&
                                    c.GetParameters()[0].ParameterType.IsGenericType &&
                                    c.GetParameters()[0].ParameterType.GetGenericTypeDefinition() == typeof(IEnumerable <>))
                             .First();

                Expression list = Expression.New(constr, array);

                Expression queryable =
                    Expression.Call(
                        typeof(Queryable)
                        .GetMethods().Where(m => m.Name == "AsQueryable" && m.IsGenericMethod).Single()
                        .MakeGenericMethod(listType.GetGenericArguments()[0]),
                        list);

                return(queryable);
            }
            else if (typeof(DataRow).IsAssignableFrom(resultType))
            {
                IKeyInfoHelper helper = new DataRowKeyInfoHelper(resultType);

                return(helper.CreateKeyFactoryExpression(arguments));
            }

            throw new InvalidOperationException();
        }