有没有一种方法可以通过字符串或索引访问Dapper FastExpando中的列?

25

我正在使用 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问题中的答案不起作用。我仍然收到相同的Target Invocation异常。那么...

有没有办法使用Dapper FastExpando实现我想要做的事情?


虽然所选答案对于“该SO问题”无效,但是那个问题中有一个答案是可行的。https://dev59.com/C2445IYBdhLWcg3wTIZf#5738983 - jbtule
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");

我发现自己总是使用 FirstOrDefault(),但在尝试访问行索引之前仍然需要先检查行是否为空。有没有一种方法可以尝试获取列值或特定行,如果不存在则返回默认值? - crush

2

关于标题中的“or index?”部分 - 我需要通过索引访问结果,因为返回的列名有时会更改,因此可以使用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");

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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接