23

我正在拉入一个Dapper FastExpando对象,并希望能够在运行时而不是在设计/编译时动态引用列名。所以我希望能够做到以下几点:

var testdata = conn.Query("select * from Ride Where RiderNum = 21457");

我希望能够做到以下几点:

foreach( var row in testdata) {
    var Value = row["PropertyA"];
}

我明白我可以做到:

var Value = row.PropertyA;

但我不能这样做,因为我需要的属性的名称要到运行时才能知道。

这个 SO Question的答案不起作用。我仍然得到同样的Target Invocation例外。所以...

有什么办法可以用 Dapper FastExpando 做我想做的事吗?

4

3 回答 3

36

当然,它实际上比这更容易:

var sql = "select 1 A, 'two' B";
var row = (IDictionary<string, object>)connection.Query(sql).First();
row["A"].IsEqualTo(1);
row["B"].IsEqualTo("two");
于 2011-05-29T23:52:56.783 回答
2

关于标题“或索引?”的部分 - 我需要按索引访问结果,因为返回的列名有时会更改,因此您可以使用 Sam Saffron 的答案的变体,如下所示:

var sql = "select 1, 'two'";
var row = (IDictionary<string, object>)connection.Query(sql).First();
row.Values.ElementAt(0).IsEqualTo(1);
row.Values.ElementAt(1).IsEqualTo("two");
于 2014-08-04T22:01:40.427 回答
1

有一种简单的方法可以直接访问示例下方的字段

string strConexao = WebConfigurationManager.ConnectionStrings["connection"].ConnectionString;

conexaoBD = new SqlConnection(strConexao);
conexaoBD.Open();

var result = conexaoBD.Query("Select Field1,Field2 from Table").First();

//access field value result.Field1 
//access field value result.Field2

if (result.Field1 == "abc"){ dosomething}
于 2018-11-05T23:41:30.320 回答