我的扩展方法的完整定义首先出现。
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
和string
info 投影到序列旁边:
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>
。
那么我应该如何构建最终表达式呢?