2008-10-28 127 views
72

如何正確地將使用Linq的SQL(2008)中的兩列轉換爲Dictionary(用於緩存)?Linq-to-SQL ToDictionary()

我目前通過IQueryable b/c循環無法使ToDictionary方法正常工作。有任何想法嗎? 這工作:

var query = from p in db.Table 
      select p; 

Dictionary<string, string> dic = new Dictionary<string, string>(); 

foreach (var p in query) 
{ 
    dic.Add(sub.Key, sub.Value); 
} 

我真正想要做的是這樣的事情,這似乎不工作:

var dic = (from p in db.Table 
      select new {p.Key, p.Value }) 
      .ToDictionary<string, string>(p => p.Key); 

但我得到這個錯誤: 無法從轉換' System.Linq.IQueryable」到‘System.Collections.Generic.IEnumerable’

回答

108
var dictionary = db 
    .Table 
    .Select(p => new { p.Key, p.Value }) 
    .AsEnumerable() 
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value) 
; 
+0

對不起,我可能不清楚,我試過thie之前,但是這會創建一個Dictionary ,而不是Dictionary Codewerks 2008-10-28 22:57:14

+0

試試`kvp => kvp.Value as string `。答案的重點是`.AsEnumerable()`。 – yfeldblum 2008-10-28 23:01:09

+0

謝謝,是的,我認爲需要AsEnumerable,但ToDictionary調用仍然無效。這兩列都是SQL中的varchars,所以它們以字符串的形式返回,但我無法弄清楚如何將它變成Dic。 – Codewerks 2008-10-28 23:04:26

13

你只定義鍵,但你需要包括值也:

var dic = (from p in db.Table 
      select new {p.Key, p.Value }) 
      .ToDictionary(p => p.Key, p=> p.Value); 
9

感謝球員,你的回答幫我解決這個問題,應該是:

var dic = db 
     .Table 
     .Select(p => new { p.Key, p.Value }) 
     .AsEnumerable() 
     .ToDictionary(k=> k.Key, v => v.Value); 
1

爲什麼你會在表中創建的每個項目的匿名對象只是把它轉換?

你可以簡單地使用這樣的: IDictionary<string, string> dic = db.Table.ToDictionary(row => row.Key, row => row.Value); 您可能需要包括表和ToDictionary之間的AsEnumerable()()調用。 我不知道db.Table的確切類型。


還糾正第一個示例,您的第二個循環變量在聲明和用法不匹配。