Ricevi tutte le chiamate 'where' usando ExpressionVisitor

c# expression-trees iqueryable lambda linq

Domanda

Ho una query, come tale:

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

Voglio implementare un ExpressionVisitor per estrarre ENTRAMBI le clausole where come Lambda, ma finora sono stato in grado di ottenere solo il primo utilizzando una classe chiamata "InnermostWhereFinder" che viene dal tutorial MSDN su un provider di query personalizzato per il servizio web 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;
        }
    }

Ive ha provato a modificare questa classe pesantemente per restituire entrambe le clausole senza successo. Non è possibile trovare alcuna documentazione di questo tipo, qualcuno può aiutarti? In definitiva, ciò richiederà la creazione di più oggetti LambdaExpression con cui posso lavorare, credo.

Risposta accettata

Utilizzare la classe trovata qui http://msdn.microsoft.com/en-us/library/bb882521%28v=vs.90%29.aspx come base. Puoi quindi creare il tuo visitatore in questo modo

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché