【发布时间】:2011-05-29 18:28:33
【问题描述】:
我有一个查询,例如:
var query = from sessions in dataSet
where (names.Contains(sessions.Username))
where (sessions.Login.TimeOfAction == dt)
select new { sessions.Username,
sessions.Login,
sessions.Logout, sessions.Duration };
我想实现一个 ExpressionVisitor 来将两个 where 子句提取为 Lambda,但到目前为止,我只能使用一个名为“InnermostWhereFinder”的类来获得第一个,该类来自于 TerraServer 的自定义查询提供程序的 MSDN 教程网络服务。
它是:
internal class InnermostWhereFinder : ExpressionVisitor
{
private MethodCallExpression innermostWhereExpression;
public MethodCallExpression GetInnermostWhere(Expression expression)
{
Visit(expression);
return innermostWhereExpression;
}
protected override Expression VisitMethodCall(MethodCallExpression expression)
{
if (expression.Method.Name == "Where")
innermostWhereExpression = expression;
Visit(expression.Arguments[0]);
return expression;
}
}
我尝试对这个类进行大量调整以返回两个 where 子句,但均未成功。找不到任何关于此的出色文档,有人可以帮忙吗?我认为,这最终需要产生多个我可以使用的 LambdaExpression 对象。
【问题讨论】:
标签: c# linq expression-trees iqueryable lambda