2011-10-19 10 views
8

Sto usando Dapper per recuperare un set di risultati a 2 colonne in un dizionario. Ho notato che intellisense mi mostra un .ToDictionary() quando mi passa il mouse sopra il gruppo di risultati, ma non riesco a farlo funzionare dal momento che Dapper utilizza le proprietà dinamiche/expandoObjectcome convertire Dizionario <dinamico, dinamico> in Dizionario <stringa, stringa> utilizzando Colllection.ToDictionary()

Dictionary<string, string > rowsFromTableDict = new Dictionary<string, string>(); 
using (var connection = new SqlConnection(ConnectionString)) 
{ 
    connection.Open(); 
    var results = connection.Query 
        ("SELECT col1 AS StudentID, col2 AS Studentname 
        FROM Student order by StudentID"); 
    if (results != null) 
    { 
    //how to eliminate below foreach using results.ToDictionary() 
    //Note that this is results<dynamic, dynamic> 
     foreach (var row in results) 
     { 
       rowsFromTableDict.Add(row.StudentID, row.StudentName); 
     } 
     return rowsFromTableDict; 
    } 
} 

grazie

risposta

14

Prova:

results.ToDictionary(row => (string)row.StudentID, row => (string)row.StudentName); 

Una volta che si dispone di un oggetto dinamico, ogni cosa che si fa con esso e le proprietà e i metodi corrispondenti sono di tipo dinamico. Devi definire un cast esplicito per riportarlo in un tipo che non è dinamico.

+0

sì. questo lo fa grazie – Gullu

+0

+1 per aver ricordato di escludere 'dinamico'. –

+0

La dinamica è buona, ma ha un sacco di trappole come il bisogno di ricondurre i tipi statici. –

-1
if (results != null) 
{ 
    return results.ToDictionary(x => x.StudentID, x => x.StudentName);  
} 
+0

Sapevo che non era così semplice. Errore Impossibile convertire implicitamente il tipo 'System.Collections.Generic.Dictionary ' a 'System.Collections.Generic.Dictionary ' – Gullu