Erhalten Sie alle "Where" -Aufrufe mit ExpressionVisitor

c# expression-trees iqueryable lambda linq

Frage

Ich habe eine Abfrage, wie zum Beispiel:

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 };

Ich möchte einen ExpressionVisitor implementieren, um BEIDE WHERE-Klauseln als Lambdas zu extrahieren, aber bisher konnte ich den ersten nur mit einer Klasse namens "InnermostWhereFinder" erhalten, die aus dem MSDN-Lernprogramm eines benutzerdefinierten Abfrageanbieters für den TerraServer-Webdienst stammt .

Es ist:

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;
        }
    }

Ich habe versucht, diese Klasse stark zu optimieren, um beide Where-Klauseln ohne Erfolg zurückzugeben. Konnte keine großartige Dokumentation dazu finden, kann jemand helfen? Dies wird letztendlich zu mehreren LambdaExpression-Objekten führen müssen, mit denen ich arbeiten kann, denke ich.

Akzeptierte Antwort

Verwenden Sie die hier gefundene Klasse http://msdn.microsoft.com/en-us/library/bb882521%28v=vs.90%29.aspx als Basis. Sie können dann Ihren Besucher so erstellen

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;
        }
    }


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum