我的扩展方法的完整定义首先出现。
static IQueryable<TResult> WithTicketNumbers<T, TResult>(
this IQueryable<T> q,
Expression<Func<T, Ticket>> ticketSelector,
Expression<Func<T, string, TResult>> resultSelector,
int digitsCount)
我有这个IQueryable<T> q序列,这是扩展的目标。
q此方法通过以下方式获取票证ticketSelector:
var tickets = q.Select(ticketSelector);
接下来,也是该方法的主要目标,是string从类中获取一些 -linq-supported-infoTicket并将两者Ticket和stringinfo 投影到序列旁边:
var tickets2 = tickets.Select(W => new { Ticket = W, Info = W.Name + "123"});
最后,我希望我的方法返回一个IQueryable将选择用户想要的内容resultSelector。这个结果选择器同时选择票证和信息参数,并产生用户希望它产生的结果。我有点坚持Expression上课来创造适当的表达。
到目前为止,我得到了我的两个参数:
ParameterExpression tParameter = Expression.Parameter(typeof(T));
ParameterExpression stringParameter = Expression.Parameter(typeof(string));
另外,我认为,最终的 lambda:
Expression<Func<T, string, TResult>> lambda =
Expression.Lambda<Func<T, string, TResult>>
(/* ? */, tParameter, stringParameter);
但是,我无法弄清楚身体。
我可以Expression.Property通过反射获得两个属性Ticket和Info,但是需要一个类型,并且我在那里有匿名类型,在tickets2.
接下来,(我猜)我需要在lambda内部使用它tickets2来生成方法 result IQueryable<TResult>。
那么我应该如何构建最终表达式呢?