Example #1
0
        protected override Expression VisitMember(MemberExpression node)
        {
            var expression  = node.Expression;
            var member      = node.Member;
            var parentValue = expression != null?Evaluate(expression) : null;

            if (parentValue != null)
            {
                // プロパティが列定義と結びつくものなら列定義を登録する
                if (member.MemberType == MemberTypes.Property)
                {
                    var pi     = (PropertyInfo)member;
                    var colDef = _ColumnMap.TryGet(parentValue, pi);
                    if (colDef != null)
                    {
                        _Code.Add(colDef);
                        return(node);
                    }
                }
            }

            // Nullable の HasValue プロパティなら IS NOT NULL を登録する
            if (node.Member.Name == "HasValue")
            {
                _Code.Push();
                this.Visit(node.Expression);
                _Code.Pop();
                _Code.Add(SqlKeyword.IsNotNull);
                return(node);
            }

            // ノードを評価し値を取得する
            var value = Evaluate(node);

            // ElementCode に展開できるものなら展開する
            if (ExpandIfPossible(value))
            {
                return(node);
            }

            // ※評価時のメンバアクセス結果の値が登録される
            _Code.AddObject(value);
            return(node);
        }