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