2014-11-14 112 views
6

按照小巧玲瓏的文檔,可以使用下面的代碼從短小精悍得到的動態列表回:小巧玲瓏的結果(小巧玲瓏行)用括號標記

var rows = connection.Query("select 1 A, 2 B union all select 3, 4"); 

((int)rows[0].A) 
    .IsEqualTo(1); 

((int)rows[0].B) 
    .IsEqualTo(2); 

((int)rows[1].A) 
    .IsEqualTo(3); 

((int)rows[1].B) 
    .IsEqualTo(4); 

是什麼,不過使用的動態,如果你必須知道字段的字段名稱和數據類型。 如果我有:

var result = Db.Query("Select * from Data.Tables"); 

我希望能夠做到以下幾點: 獲取字段名稱的列表和數據類型返回。

遍歷它使用的字段名稱和通過以下方式取回數據:

result.Fields 
["Id", "Description"] 

result[0].values 
[1, "This is the description"] 

這將讓我獲得

result[0].["Id"].Value 

,這將給成果1和具有類型如的Int 32

result[0].["Id"].Type --- what datattype is the value returned 

result[0].["Description"] 

這將給出結果「這是描述」並且將是字符串類型。

我看到有一個結果[0] .table,它有一個帶有字段名數組的dapperrow對象,並且還有一個result.values,它是一個包含值的對象[2],但它可以不被訪問。如果我將鑽表添加到鑽出的列名稱中,我可以獲得該ID。自動創建的表是:

(new System.Collections.Generic.Mscorlib_CollectionDebugView<Dapper.SqlMapper.DapperRow>(result as System.Collections.Generic.List<Dapper.SqlMapper.DapperRow>)).Items[0].table.FieldNames[0] "Id" string 

所以我應該能夠得到結果[0] .Items [0] .table.FieldNames [0],並獲得 「身份證」 了。

請協助。

回答

11

您可以將每一行投射到IDictionary<string, object>,這應該提供對名稱的訪問權和。我們目前沒有明確跟蹤類型 - 我們根本沒有必要。如果這還不夠,請考慮使用返回IDataReader的精簡方法 - 這將提供對原始數據的訪問,同時仍允許方便的調用/參數化語法。

例如:

var rows = ... 
foreach(IDictionary<string, object> row in rows) { 
    Console.WriteLine("row:"); 
    foreach(var pair in row) { 
     Console.WriteLine(" {0} = {1}", pair.Key, pair.Value); 
    } 
} 
+0

我該怎麼做。他們的問題是我事先並不知道關鍵是什麼,所以我不能遍歷行並轉換字段名稱(例如Id,Description作爲字典鍵,因爲我只能使用結果[0] .Id或結果[0]。描述 – Andy 2014-11-15 05:34:30

+0

結果中有鍵和值,但它在一個名爲DapperTable的私人密封類中,與值 – Andy 2014-11-15 05:37:23

+0

@Andy相同我將編輯以說明 – 2014-11-15 10:23:39