最近一直在使用Dapper,所以当然有很多代码如:
var id = 123;
var s = "hola";
conn.Execute("update foo set bar = @a where id = @b", new { a = s, b = id })
这也是我第一次使用C#6.0,所以我注意到上面和字符串插值之间的相似性:
$"update foo set bar = {s} where id = {id}"
然而。这只适用于普通字符串,不需要任何参数知识,转义等等。是否可能以某种方式反映编译器生成的中间结构,然后使用它来正确设置参数?因此,不是产生的字符串,而是可以获得包含带有孔的字符串和对象数组的东西。对我来说,用这些数据可以做很多事情。
答案 0 :(得分:3)
尝试这样的事情:
public static class DbExtensions
{
public static IDbCommand CreateCommand(this IDbConnection connection, FormattableString commandText)
{
var command = connection.CreateCommand();
command.CommandType = CommandType.Text;
if (commandText.ArgumentCount > 0)
{
var commandTextArguments = new string[commandText.ArgumentCount];
for (var i = 0; i < commandText.ArgumentCount; i++)
{
commandTextArguments[i] = "@p" + i.ToString();
command.AddParameter(commandTextArguments[i], commandText.GetArgument(i));
}
command.CommandText = string.Format(CultureInfo.InvariantCulture, commandText.Format, commandTextArguments);
}
else
{
command.CommandText = commandText.Format;
}
return command;
}
}