protected override Expression VisitMember(MemberExpression memberExpression) { if (memberExpression.IsNull()) { return memberExpression; } if (memberExpression.Expression.NodeType == ExpressionType.Parameter) { var property = memberExpression.Member as PropertyInfo; var attribute = GetMetadataAttribute(memberExpression, property); _currentParameter = attribute.ParameterName; var parameter = new SqlParameter { ParameterName = attribute.ParameterName, SqlDbType = attribute.DbType, }; _parameters.Add(parameter); _currentField = "{0}".FormatString(BuildFieldName(attribute.FieldName)); _queryBuilder.Append(_currentField); } if (memberExpression.Expression.NodeType == ExpressionType.MemberAccess) { var property = memberExpression.Member as PropertyInfo; var attribute = property.GetCustomAttributes(typeof(FieldMetadataAttribute)).FirstOrDefault() as FieldMetadataAttribute; var parameter = attribute.IsNull() ? _parameters.Find(p => p.ParameterName == _currentParameter) : _parameters.Find(p => p.ParameterName == attribute.ParameterName); var value = GetLocalValue(memberExpression); if (!property.Name.Equals("Day") && !property.Name.Equals("Month") && !property.Name.Equals("Year")) { if (_addParameters) { parameter.Value = value.IsNull() ? DBNull.Value : value; _queryBuilder.Append(parameter.ParameterName); _currentParameter = parameter.ParameterName; } else { _queryBuilder.Append(value.IsNull() ? "NULL" : value); } } } if (memberExpression.Expression.NodeType == ExpressionType.Call) { var value = GetLocalValue(memberExpression); _queryBuilder.Append(_currentParameter); var parameter = _parameters.Find(p => p.ParameterName == _currentParameter); parameter.Value = value.IsNull() ? DBNull.Value : value; } if (memberExpression.Expression.NodeType == ExpressionType.Constant) { var value = GetLocalValue(memberExpression); _queryBuilder.Append(_currentParameter); var parameter = _parameters.Find(p => p.ParameterName == _currentParameter); parameter.Value = value.IsNull() ? DBNull.Value : value; } return memberExpression; }