2012-04-05 120 views
1

如何將下列lambda轉換爲表達式樹?lambda表達式樹

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 2012-04-06 00:03:14

+0

@ ban-G,請不要編輯問題以包含答案。 **這對每個人來說都是非常令人困惑的。**網站的目的是查看問題,然後查看下面的答案。你的行爲阻止了這個隱喻的運作。 (我非常困惑,爲什麼Balazs的回答很有用,因爲它已經是問題中包含的代碼。)乾杯。 – 2012-04-06 01:59:24

+0

明白了。是的,當我糾正代碼時,它使我感到困惑。感謝您恢復我的更改。 – 2012-05-03 21:27:35

回答

5

我想這應該這樣做:

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

完美的作品!謝謝! – 2012-04-06 00:33:51