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