2011-05-29 61 views
23

我正在拉動一個Dapper FastExpando對象,並希望能夠在運行時動態引用列名稱,而不是在設計/編譯時。所以,我希望能夠做到以下幾點:有沒有辦法通過字符串或索引訪問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做什麼?

+0

雖然所選答案對於「此SO問題」無效在那個問題上會有答案。 http://stackoverflow.com/questions/4939508/get-value-of-c-dynamic-property-via-string/5738983#5738983 – jbtule 2011-06-02 15:22:42

回答

32

當然,它實際上是比這樣更容易:「或索引」

var sql = "select 1 A, 'two' B"; 
var row = (IDictionary<string, object>)connection.Query(sql).First(); 
row["A"].IsEqualTo(1); 
row["B"].IsEqualTo("two"); 
+0

我發現自己總是使用'FirstOrDefault()',仍然必須檢查行是在嘗試訪問行索引之前先爲空。有沒有辦法嘗試獲取列值或特定的行,或者返回默認值(如果不存在)? – crush 2014-10-09 21:24:11

1

關於標題的一部分 - 我需要通過索引訪問結果,因爲列名返回有時會發生變化,因此您可以使用以下薩姆藏紅回答的變體:

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"); 
相關問題