在当前版本中,答案是“否”,原因有两个:
- 该代码尝试过滤未使用的参数 - 目前正在删除所有这些参数,因为它找不到类似
@id
,:id
或?id
sql 中的任何内容
- 从类型添加值的代码对参数使用任意(好吧,按字母顺序)顺序(因为反射不保证成员的顺序),使位置匿名参数不稳定
好消息是这两个都是可以修复的
- 我们可以使过滤行为有条件
- 我们可以检测具有匹配所有属性名称的构造函数的类型的类别,并使用构造函数参数位置来确定属性的合成顺序 - 匿名类型属于此类
对我的本地克隆进行这些更改,以下内容现在通过:
// see https://stackoverflow.com/q/18847510/23354
public void TestOleDbParameters()
{
using (var conn = new System.Data.OleDb.OleDbConnection(
Program.OleDbConnectionString))
{
var row = conn.Query("select Id = ?, Age = ?", new DynamicParameters(
new { foo = 12, bar = 23 } // these names DO NOT MATTER!!!
) { RemoveUnused = false } ).Single();
int age = row.Age;
int id = row.Id;
age.IsEqualTo(23);
id.IsEqualTo(12);
}
}
请注意,我目前在这里使用是为了避免向/DynamicParameters
添加更多重载- 因为这需要添加到相当多的方法中。将其添加到一处即可解决。Query
Query<T>
DynamicParameters
在我推动这个之前,我愿意接受反馈——这对你有用吗?
编辑:加上一个时髦的smellsLikeOleDb
(不,不是开玩笑),我们现在可以更直接地做到这一点:
// see https://stackoverflow.com/q/18847510/23354
public void TestOleDbParameters()
{
using (var conn = new System.Data.OleDb.OleDbConnection(
Program.OleDbConnectionString))
{
var row = conn.Query("select Id = ?, Age = ?",
new { foo = 12, bar = 23 } // these names DO NOT MATTER!!!
).Single();
int age = row.Age;
int id = row.Id;
age.IsEqualTo(23);
id.IsEqualTo(12);
}
}