Ejemplo n.º 1
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.º 2
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();
        }