Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void Main()
- {
- var fn = GroupJoinExp<IndexString, IndexNumber, JoinResult>();
- Console.WriteLine(fn.ToString());
- }
- // Define other methods and classes here
- public Expression<Func<IQueryable<TOuter>, IEnumerable<TInner>, IQueryable<TResult>>> GroupJoinExp<TOuter, TInner, TResult>()
- {
- var tOuter = typeof(TOuter);
- var miOuterKey = tOuter.GetMember("index")[0];
- var miOuterValue = tOuter.GetMember("value")[0];
- var tInner = typeof(TInner);
- var miInnerKey = tInner.GetMember("index")[0];
- var pOuter = Expression.Parameter(tOuter, "o");
- var pInner = Expression.Parameter(tInner, "i");
- var miResStr = typeof(TResult).GetMember("str")[0];
- var miResGrp = typeof(TResult).GetMember("grp")[0];
- // selector expression:
- var pInnerEnum = Expression.Parameter(typeof(IEnumerable<TInner>), "g");
- var meminit =
- Expression.MemberInit(
- Expression.New(typeof(TResult)),
- Expression.Bind(miResStr, Expression.MakeMemberAccess(pOuter, miOuterValue)),
- Expression.Bind(miResGrp, pInnerEnum)
- );
- var selector = Expression.Lambda(meminit, pOuter, pInnerEnum);
- // parameters for GroupJoin:
- var gjpOuter = Expression.Parameter(typeof(IQueryable<TOuter>), "outer");
- var gjpInner = Expression.Parameter(typeof(IEnumerable<TInner>), "inner");
- var gjpOuterKeySelector = Expression.Lambda(Expression.MakeMemberAccess(pOuter, miOuterKey), pOuter);
- var gjpInnerKeySelector = Expression.Lambda(Expression.MakeMemberAccess(pInner, miInnerKey), pInner);
- var gjpSelector = selector;
- // GroupJoin expression
- var fnGrpJn = Expression.Call(typeof(Queryable), "GroupJoin", new Type [] { tOuter, tInner, typeof(Int32), typeof(TResult) },
- gjpOuter,
- gjpInner,
- gjpOuterKeySelector,
- gjpInnerKeySelector,
- gjpSelector
- );
- var res = (Expression<Func<IQueryable<TOuter>, IEnumerable<TInner>, IQueryable<TResult>>>) Expression.Lambda(fnGrpJn, gjpOuter, gjpInner);
- return res;
- }
- public class IndexString
- {
- public int index;
- public string value;
- }
- public class IndexNumber
- {
- public int index;
- public double dbl;
- }
- public class JoinResult
- {
- public string str;
- public IEnumerable<IndexNumber> grp;
- }
RAW Paste Data