【发布时间】:2013-05-30 06:37:34
【问题描述】:
我想使用以下 API 生成表达式树:
var managers = dataContext.Employees.Where(e => e.Subordinates.Any());
此外,我如何生成表达式树来执行此操作:
var managedEmployees = managers.ToDictionary(key => key.Manager, value => value.Subordinates.Select(s => s.FullName));
到目前为止,我已经为 .Where() 提出了以下内容,但它出错了,因为它不喜欢 new Type[] { typeof(Func<Employee, IEnumerable<Employee>>) } 中的类型参数。
ParameterExpression employeesParameter = Expression.Parameter(typeof(Employee), "e");
MemberExpression subordinatesProperty = Expression.Property(employeesParameter, typeof(Employee).GetProperty("Subordinates"));
MethodCallExpression hasSubordinates = Expression.Call(typeof(Enumerable),
"Any",
new Type[] { typeof(Employee) },
subordinatesProperty);
LambdaExpression whereLambda = Expression.Lambda(hasSubordinates, employeesParameter);
MethodCallExpression whereExpression = Expression.Call(typeof(Queryable),
"Where",
new Type[] { typeof(Func<Employee, IEnumerable<Employee>>) },
dataContext.Employees.AsQueryable(),
whereLambda);
【问题讨论】:
-
对于初学者“where”应该通过methodinfo调用来调用。括号内的东西是表达式
-
不,如果我从 Where() 中删除 Any() 并将其设置为其他内容,例如说 Where(e => e.EmployedDate > '1/1/2013',这对我有用)。然后我可以将类型从 Func
> 更改为 Employee,它可以按预期工作。问题完全在于 Any() 函数,我不知道要提供什么类型。 -
请不要多次发布同一个问题。如果您有什么要补充的,请编辑您的原始问题。
-
公平地说,另一个问题没有得到答案。
-
另一个问题似乎完全让所有看过它的人感到困惑。所以我用更通用的代码尝试了这个问题。
标签: c# linq expression-trees