2012-12-13 99 views
4

我的讀者從具有第1 select語句中的一個作爲小巧玲瓏:讀入字典從readrer

select id , name from FSubsystem 

出的10個選staments

存儲過程 讀取內容,我宣佈詞典如下 詞典SubsystemMApping = new Dictionary();

var reader = connection.QueryMultiple(...); 

我需要讀第一個選擇語句值字典SubsystemMApping。 id - to Key and name - to value

我試過用reader.Read.Todictionary()來做,但無法成功。我不太熟悉Func &行動。 dats之所以我認爲我無法正確理解Todictionary的2重載。

任何人都可以幫忙嗎?

回答

8

想象一下,您有一個返回給您的POCO。像

public class Item 
{ 
    public int Id { get; set;} 
    public string Name { get; set;} 
} 

東西現在想象一下,你有一個IEnumerable<Item>和收集填充(這是最有可能是什麼小巧玲瓏正在恢復)

要使用ToDictionary方法,你有2個重要的重載。

var dictionary = itemList.ToDictionary(item => item.Id); 

這會返回一個Dictionary<int,Item>的字典中的關鍵是每個item.Id財產。

的鍵/值過載:

var dictionary = itemList.ToDictionary(item => item.Id , item => item.Name); 

此重載使用指定item.Id爲鍵和爲item.Name值創建一個Dictionary<int,string>

還有2個重載允許您在確定密鑰時使用自定義比較器。

+0

我會添加推薦使用'buffered:false',這樣當'ToDictionary'被調用時,您不需要多次迭代結果集。 –

8

對於通用API,Stan已經描述了它。非通用讀取API意味着您也可以通過動態繞過POCO:

var lookup = reader.Read().ToDictionary(x => (int)x.id, x => (string)x.name); 

基本上,通過「動態」它重新暴露列作爲虛擬財產。

+0

對於那些想知道'閱讀器'在這種情況下是Dapper的一部分,而不是'DataReader'。謝謝馬克,現在我要回去閱讀你的博客了。 –

+0

@Stan事實上,'reader'是從問題中提取出來的,通過'QueryMultiple' –

+0

只是想澄清一下任何可能錯過的人。 –