public override LambdaExpression GetBindExpression() { bool sourceIsQueryable = SourceValueType.IsGenericQueryable(); bool targetIsQueryable = TargetValueType.IsGenericQueryable(); var selectMethod = sourceIsQueryable ? MethodFinder.GetQuerybleSelect <TSourceValueItem, TTargetValueItem>() : MethodFinder.GetEnumerableSelect <TSourceValueItem, TTargetValueItem>(); var callSelectExpression = Expression.Call(selectMethod, this.SourceExpression.Body, GetAssignExpression()); var toResultExpression = GetResultExpression(callSelectExpression, sourceIsQueryable, targetIsQueryable); // 需要处理source为null的情况 var resultExpression = Expression.Condition( Expression.Equal(this.SourceExpression.Body, Expression.Constant(null)) , Expression.Constant(null, this.TargetValueType), toResultExpression); return(Expression.Lambda(resultExpression, this.SourceExpression.Parameters.First())); }
private Expression GetResultExpression(Expression selectExpression, bool sourceIsQueryable, bool targetIsQueryable) { if (sourceIsQueryable && targetIsQueryable) { return(selectExpression); } if (!sourceIsQueryable && targetIsQueryable) { return(Expression.Call( MethodFinder.GetAsQueryable(TargetValueType.GetQueryableItemType()), selectExpression)); } var toResultMethod = this.TargetValueType.IsArray ? MethodFinder.GetEnumerableToArray <TTargetValueItem>() : MethodFinder.GetEnumerableToList <TTargetValueItem>(); return(Expression.Call(toResultMethod, selectExpression)); }