我有一個查詢,像這樣:
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;
}
}
我曾經嘗試過大量調整這個類來返回兩個沒有成功的子句。找不到任何關於此的好文檔,任何人都可以幫忙嗎?我想這最終需要產生多個可以使用的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;
}
}