gpt4 book ai didi

c# - 使用 ExpressionVisitor 获取所有 'where' 调用

转载 作者:行者123 更新时间:2023-11-30 14:41:07 24 4
gpt4 key购买 nike

我有一个问题,像这样:

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”的类来获得第一个,该类来自 MSDN 教程中关于 TerraServer 的自定义查询提供程序网络服务。

它是:

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 对象。

最佳答案

使用此处找到的类 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;
}
}

关于c# - 使用 ExpressionVisitor 获取所有 'where' 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4515550/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com