【问题标题】:Is there a way to access the columns in a Dapper FastExpando via string or index?有没有办法通过字符串或索引访问 Dapper FastExpando 中的列?
【发布时间】:2011-09-04 08:34:43
【问题描述】:

我正在引入一个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;

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

this SO Question 的回答无效。我仍然得到相同的Target Invocation 异常。所以...

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

【问题讨论】:

标签: c# dynamic dapper


【解决方案1】:

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

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() 并且在尝试访问行索引之前仍然必须先检查行是否为空。有没有办法尝试获取列值或特定行,或者如果不存在则返回默认值?
【解决方案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");

【讨论】:

    【解决方案3】:

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

    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}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 2013-11-08
      相关资源
      最近更新 更多