title: How to create a dynamic LINQ join extension method
body: <p>There was a library of dynamic <a href="http://en.wikipedia.org/wiki/Language_Integrated_Query" rel="noreferrer">LINQ</a> extensions methods released as a sample with <a href="http://en.wikipedia.org/wiki/Microsoft_Visual_Studio#Visual_Studio_2008" rel="noreferrer">Visual&nbsp;Studio&nbsp;2008</a>. I'd like to extend it with a join method. The code below fails with a parameter miss match exception at run time. Where is the problem?</p>
  
  <pre><code>public static IQueryable Join(this IQueryable outer, IEnumerable inner,
                                string outerSelector, string innerSelector, string resultsSelector,
                                params object[] values)
  {
      if (inner == null)
          throw new ArgumentNullException("inner");
      if (outerSelector == null)
          throw new ArgumentNullException("outerSelector");
      if (innerSelector == null)
          throw new ArgumentNullException("innerSelector");
      if (resultsSelector == null)
          throw new ArgumentNullException("resultsSelctor");
  
      LambdaExpression outerSelectorLambda =
          DynamicExpression.ParseLambda(outer.ElementType, null,
                                        outerSelector, values);
      LambdaExpression innerSelectorLambda =
          DynamicExpression.ParseLambda(inner.AsQueryable().ElementType,
                                        null, innerSelector, values);
  
      ParameterExpression[] parameters = new ParameterExpression[] {
          Expression.Parameter(outer.ElementType, "outer"),
          Expression.Parameter(inner.AsQueryable().ElementType,
          "inner")
      };
      LambdaExpression resultsSelectorLambda =
          DynamicExpression.ParseLambda(parameters, null,
                                        resultsSelector, values);
  
      return outer.Provider.CreateQuery(
          Expression.Call(
              typeof(Queryable), "Join", new Type[] {
                  outer.ElementType,
                  inner.AsQueryable().ElementType,
                  outerSelectorLambda.Body.Type,
                  innerSelectorLambda.Body.Type,
                  resultsSelectorLambda.Body.Type
              },
              outer.Expression, inner.AsQueryable().Expression,
              Expression.Quote(outerSelectorLambda),
              Expression.Quote(innerSelectorLambda),
              Expression.Quote(resultsSelectorLambda))
          );
  }
  </code></pre>