Конструктор известен, это 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 нет, остальной код копирует ваш один в один.
Попробовал все же реализовать. Пусть не весь функционал, но справляется с: