/// <summary> /// Gets the name of the column in the database for the specified type, /// using the configured <see cref="IColumnNameResolver"/>. /// </summary> /// <param name="propertyInfo">The <see cref="PropertyInfo"/> to get the column name for.</param> /// <param name="sqlBuilder">The SQL builder instance.</param> /// <returns>The column name in the database for <paramref name="propertyInfo"/>.</returns> public static string Column(PropertyInfo propertyInfo, ISqlBuilder sqlBuilder) { var key = $"{sqlBuilder.GetType()}.{propertyInfo.DeclaringType}.{propertyInfo.Name}"; if (!_columnNameCache.TryGetValue(key, out var columnName)) { columnName = sqlBuilder.QuoteIdentifier(ColumnNameResolver.ResolveColumnName(propertyInfo)); _columnNameCache.TryAdd(key, columnName); } LogReceived?.Invoke($"Resolved column name '{columnName}' for '{propertyInfo}'"); return(columnName); }
protected override object VisitMemberAccess(MemberExpression expression) { if (expression.Member is PropertyInfo jsonValue && expression.Expression is MemberExpression jsonContainerExpr && jsonContainerExpr.Member is PropertyInfo jsonContainer && jsonContainer.IsDefined(typeof(JsonDataAttribute))) { return(SqlBuilder.JsonValue( VisitMemberAccess(jsonContainerExpr).ToString(), ColumnNameResolver.ResolveColumnName(jsonValue))); } return(base.VisitMemberAccess(expression)); }
protected override VisitResult VisitMemberAccess(MemberExpression expression) { if (expression.Member is PropertyInfo jsonValue && expression.Expression is MemberExpression jsonContainerExpr && jsonContainerExpr.Member is PropertyInfo jsonContainer && jsonContainer.IsDefined(_options.JsonDataAttributeType)) { var memberAccessResult = VisitMemberAccess(jsonContainerExpr); return(new VisitResult(SqlBuilder.JsonValue(memberAccessResult.Result.ToString(), ColumnNameResolver.ResolveColumnName(jsonValue)))); } return(base.VisitMemberAccess(expression)); }
private Mapping Get(Type type) { lock (_mappings) { if (_mappings.TryGetValue(type, out var mapping)) { return(mapping); } mapping = new Mapping { TableName = _tableNameResolver.ResolveTableName(type) }; foreach (var p in GetScaffoldableProperties(type, true)) { mapping.ColumnName.Add(p, _columnNameResolver.ResolveColumnName(p)); } _mappings.AddOrUpdate(type, t => mapping, (t, m2) => mapping); return(mapping); } }