2012-04-05 2 views
1

次のラムダをどのように表現木に変換しますか?ラムダと表現木

source.Join(lookup, s => s.Id, l => l.Id, (s,l) => l) 

私はresultSelector(s、l)=> lを除いてすべてをカバーしていると思います。

ここに私のコードです..ありがとう!

public static IQueryable<TLookup> GetLookupSource<T, TLookup, TKey>(this IQueryable<T> source, IQueryable<TLookup> lookup{ 
    ParameterExpression s = Expression.Parameter(source.ElementType, "s"); 
    Expression<Func<T, TKey>> outerKeySelector = Expression.Lambda<Func<T, TKey>>(Expression.PropertyOrField(s, "Id"), s); 

    ParameterExpression l = Expression.Parameter(lookup.ElementType, "l"); 
    Expression<Func<TLookup, TKey>> innerKeySelector = Expression.Lambda<Func<TLookup, TKey>>(Expression.PropertyOrField(l, "Id"), l); 

    Expression<Func<T, TLookup, IQueryable<TLookup>>> resultSelector = null;//<---How to compose this 

    MethodInfo joinMethod = typeof(Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public).Where(m => m.Name == "Join" && m.GetParameters().Length == 5).First(); 
    var genericJoinMethod = joinMethod.MakeGenericMethod(typeof(T), typeof(TLookup), typeof(TKey), typeof(IQueryable<TLookup>)); 
    var result = genericJoinMethod.Invoke(source, new object[] { source, lookup, outerKeySelector, innerKeySelector, resultSelector }); 
    return (IQueryable<TLookup>)result; 
} 
+0

だから、なぜあなたは結果のセレクターを追加しませんか?あなたは何を持っているのですか? – svick

+0

@ ban-G、答えを含めるために質問を決して編集しないでください。 **これは誰にとっても非常に混乱しています。**サイトの目的は質問を見て、次に答えを見ることです。あなたの行動は、その隠喩が働かないようにします。 (なぜBalazsの答えが有用かどうか私は非常に混乱していました。なぜなら、それはすでに質問に含まれていたコードなので)。 –

+0

ありがとうございます。ええ、コードを修正すると混乱しました。変更を元に戻していただきありがとうございます。 –

答えて

5

私は、これはそれを行うべきだと思う:

var resultSelector = Expression.Lambda<Func<T, TLookup, TLookup>>(l, s, l); 
+0

は完璧に機能します!ありがとう! –

関連する問題