我有一个问题,如下所示:
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 web服务的自定义查询提供程序的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对象。
发布于 2010-12-23 11:16:11
使用在这里找到的http://msdn.microsoft.com/en-us/library/bb882521%28v=vs.90%29.aspx类作为基础。然后您可以像这样创建您的访问者
internal class WhereFinder : ExpressionVisitor
{
private IList<MethodCallExpression> whereExpressions = new List<MethodCallExpression>();
public IList<MethodCallExpression> GetWhere(Expression expression)
{
Visit(expression);
return whereExpressions;
}
protected override Expression VisitMethodCall(MethodCallExpression expression)
{
if (expression.Method.Name == "Where")
whereExpressions.Add(expression);
Visit(expression.Arguments[0]);
return expression;
}
}https://stackoverflow.com/questions/4515550
复制相似问题