【发布时间】:2019-09-28 10:35:36
【问题描述】:
我在其他post中找到了这个方法,除了第4行之外,我几乎明白这是怎么回事:
public static IQueryable<T> OrderByMember<T>(this IQueryable<T> source, string memberPath)
{
var expression = source.Expression;
var parameter = Expression.Parameter(source.ElementType, "x");
string[] paths = memberPath.Split('.');
/*****************HERE*******************/
var member = paths.Aggregate((Expression)parameter, Expression.PropertyOrField);
/****************************************/
var selector = Expression.Lambda(member, parameter);
var orderByCall = Expression.Call(typeof(Queryable), "OrderBy",
new Type[] { parameter.Type, member.Type },
expression, Expression.Quote(selector));
return source.Provider.CreateQuery<T>(orderByCall);
}
为什么IEnumerable<string>.Aggregate 接受Expression 和MemberExpression?
Aggregate 的所有重载似乎都与此调用不匹配
https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.aggregate?view=netframework-4.6.2
由于我不知道那里发生了什么,请您解释一下吗?
【问题讨论】:
-
那么数组实现了IQueryable?
-
糟糕!我脑残了。
parameter是种子,PropertyOrField是累加器。它叫这个overload
标签: c# linq lambda expression-trees iqueryable