Pull to refresh
5
0
Dmitrii Smirnov @mntek

Developer

Send message
Вам этого мало? :)
Но вообще да, больше плюсов от использования FormattableString нет, остальной код копирует ваш один в один.
Как минимум обходится проверка на число параметров у string.Format(...)
Как раз для этого там и стоит TODO :)
Конструктор известен, это FormattableStringFactory.Create(string, params object[]).
Попробовал все же реализовать. Пусть не весь функционал, но справляется с:
dc.FormatSql<Order>(x => $"DELETE FROM {x} WHERE {x.Subtotal} = 0");

листинг
public static string FormatSql<T>(this DbContext context, Expression<Func<T, FormattableString>> expression)
        {
            var body = (MethodCallExpression) expression.Body;

            var sql = (string) ((ConstantExpression) body.Arguments[0]).Value;

            var args = ((NewArrayExpression) body.Arguments[1]).Expressions;
            
            var parameters = new object[args.Count];

            for (var i = 0; i < args.Count; i++)
            {
                var arg = args[i];
                
                if (arg.NodeType == ExpressionType.Parameter) // table
                {
                    var tableName = context.GetTableName(arg.Type);
                    parameters[i] = $"[{tableName}]";
                }
                else
                {
                    var operand = ((UnaryExpression) arg).Operand;

                    if (operand is MemberExpression me) // column
                    {
                        var tableName = context.GetTableName(me.Expression.Type);
                        var columnName = context.GetColumnName(me.Expression.Type, me.Member.Name);

                        parameters[i] = $"[{tableName}].{columnName}";
                    }
                    else // parameters
                    {
                        // TODO:
                    }
                    
                }
            }

            return string.Format(sql, parameters);
        }

Есть такая замечательная штука, как FormattableString. Код заполнения параметров команды упрощается примерно до такого:
private static void FillParameters(this DbCommand cmd, FormattableString sql)
{
    var substitutions = new object[sql.ArgumentCount];

    for (var i = 0; i < sql.ArgumentCount; i++)
    {
        var name = string.Concat("p", i.ToString());
        var parameter = cmd.CreateParameter();
        parameter.ParameterName = name;
        parameter.Value = sql.GetArgument(i);
        cmd.Parameters.Add(parameter);

        substitutions[i] = string.Concat("@", name);
    }

    cmd.CommandText = sql.ArgumentCount > 0 ? string.Format(sql.Format, substitutions) : sql.Format;
}
Вы читали Двое на карусели Александра Громова? Нет, конечно, умные дома — очень полезно, но вполне может возникнуть и антиутопия.
А чем не устраивает dj native swing?
Ну да, видеокарты люди приобретают специально чтобы считать на них, а не получать удовольствие от игр (:
Собственно, вас не пугает вот это заявление MS?
У них работает кэп (:
Когда вы вводите мыло счастливчика, гугл ставит его в начало очереди на инвайты и при их появлении отсылает линк на мыло.
«Эротика и порнуха. Отлично… ОТЛИЧНО!» ©
Улыбнулся над
&lt!--Красивый код, правда? -->
.
Ну что Вы советуете? Зачем? 0_о
фирменный настольный держатель для визитных карточек от Cartier.
Всей студией собраться и сдать кровь «на съемки» )
Обновился, полет нормальный (:
1
23 ...

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity