private static Expression GetPropertySetterExpr(Metadata.Column column, Expression resultExpr, Expression readerExpr) { var propertyExpression = Expression.Property(resultExpr, column.Property); var readerGetValueByNameExpression = CreateReaderGetValueExpr(column, readerExpr); return(Expression.Assign(propertyExpression, readerGetValueByNameExpression)); }
private static Expression CreateReaderGetValueExpr(Metadata.Column column, Expression readerExpr) { var propertyName = Expression.Constant(column.Name); var ordinalCallExpr = Expression.Call(readerExpr, ReaderGetOrdinalMethod, propertyName); var getValueExpr = Expression.Property(readerExpr, ReaderIndexByStringProperty, propertyName); // Return the first valid expression: // - Property is Enum, var propertyType = column.Property.PropertyType; return(EnumParseReaderValueExpression(column, getValueExpr) ?? ReaderGetSpecificTypeExpression(propertyType, readerExpr, ordinalCallExpr) ?? Expression.Convert(getValueExpr, propertyType)); }
private static Expression EnumParseReaderValueExpression(Metadata.Column column, Expression getValueExpr) { if (column.IsEnum) { // If DbEnumSaveType is Numeric, just cast var propertyType = column.Property.PropertyType; if (column.EnumSaveType == EnumSaveType.Numeric) { return(Expression.Convert(getValueExpr, propertyType)); } // Otherwise, Call (EnumType)Enum.Parse(typeof(EnumType), reader[Name].ToString(), true) return (Expression.Convert( Expression.Call( EnumParseMethod, Expression.Constant(propertyType), Expression.Call(getValueExpr, ToStringMethod), Expression.Constant(true)), propertyType)); } return(null); }
private static MethodCallExpression ColumnToParamExpression(Expression cmdExpr, Metadata.Column column, Expression objExpr) { Expression valueExpr; if (column.IsEnum && column.EnumSaveType == EnumSaveType.String) { valueExpr = Expression.Call(Expression.Property(objExpr, column.Property), ToStringMethod); } else { valueExpr = Expression.Property(objExpr, column.Property); } var parameterName = Expression.Constant("@" + column.Name); var valueAsObject = Expression.Convert(valueExpr, typeof(object)); return(Expression.Call(SetCommandParameterValueMethod, cmdExpr, parameterName, valueAsObject)); }