2010-08-01 216 views
5

我需要返回動態創建的字典的IEnumerable。LINQ的返回的IEnumerable <字典<字符串,字符串>>

僞代碼:

var x = from u in Users 

select new dictionary<string, string>{ 
    Add("Name",u.Name), 
    Add("LastName",u.LastName) 
} 

我一直想多種途徑獲得以上,但沒有成功的僞代碼示例...

我會很感激你的幫助。

+0

您能否描述一下你在做什麼? IEnumerable >似乎有點奇怪,特別是當你必須硬編碼所有元素時。 – Kobi 2010-08-01 05:28:36

回答

7
var x = from u in Users 
     select new Dictionary<string, string> { 
      { "Name", u.Name }, 
      { "LastName", u.LastName } 
     }; 
+0

這件事情沒有奏效。拋出此異常,無法識別的表達式節點:ListInit 我嘗試添加和刪除後()詞典<字符串,字符串>並沒有成功...任何想法... – Tony 2010-08-03 05:52:42

+0

@Tony,@mquander,在Users.AsEnumerable嘗試'從u ()'as'Users'可能是'IQueryable',它試圖轉換SQL腳本中的整個LINQ語句。 – 2010-08-04 05:51:03

1

這是對字典的糟糕用法 - 您只能將它用作屬性包,並創建與用戶一樣多的字典。
更好的使用的語言將與這些屬性創建自己的User類,並使用:

public class User 
{ 
    public string Name { get; set; } 
    public string LastName { get; set; } 
} 

和查詢:

var users = Users.Select(u => new User 
      { 
       Name = u.Name, 
       LastName = u.LastName 
      }); 

如果你只使用集合白化你方法,另一種選擇是創建一個匿名類:

var users = Users.Select(u => new { Name = u.Name, LastName = u.LastName }); 
+0

我完全明白這是一個非常糟糕的用途,但我不能爲我的情況提供更好的解決方案。這是整個場景......我正在創建一系列電子郵件模板。我想用regex ex動態替換一些文本:「Dear [[Name]]」 - > Replace([[Name]],Dictionary [Name] ...問題是我有多個實體可以從中收集數據。僞代碼只是使用實體用戶,但我可能有我使用User,UserCredit,UserAddress ...的情況,所以我只想返回那些在我的電子郵件模板中需要的字段,匿名類會強制我使用反射。 。 – Tony 2010-08-01 05:30:53

+0

BTW,您的例子就像一個魅力。謝謝了Kobi – Tony 2010-08-01 05:38:24

+0

我做了類似的事情最近,和有一個更復雜的解決方案。如果你在同一個模板需要不同的實體?'「你好[名],你」已經下令[ItemsCount]項目在$ [ItemsPrice]。請參閱Terms of Use「'。我曾與'User','Order'等一個'OrderContext'類,它可以用適當的字符串替換標記。這可能比將每個實體轉換爲字典更好。 – Kobi 2010-08-01 05:38:35

1

轉換方法:

public Dictionary<string, string> ToPropertyDictionary(User theUser) 
{ 
    Dictionary<string, string> result = new Dictionary<string, string>(); 
    result.Add("Name", theUser.Name); 
    result.Add("LastName", theUser.Name); 
    return result; 
} 

通過調用:

IEnumerable<Dictionary<string, string>> x = 
    from u in Users.AsEnumerable() //ensure local execution by using AsEnumerable 
    select ToPropertyDictionary(u); 
+0

這裏的另一種方法是爲所有實體設置一個通用接口,有'User.Select(u => u.ToPropertyDictionary())' – Kobi 2010-08-01 08:22:53

+0

這件事情沒有奏效。拋出這個異常無法識別的表達式節點:ListInit 我試圖在Dictionary 之後添加並刪除()並且沒有成功......任何想法... – Tony 2010-08-03 05:53:31

+0

用戶...是否是本地集合? – 2010-08-03 14:29:12

4

你得到的「無法識別的表達式節點」的錯誤是因爲LINQ to SQL中未能把字典相關的代碼轉換成SQL。您可以使用AsEnumerable()來使編譯器使用LINQ to Objects代替:

var x = from u in Users.AsEnumerable() 
     select new Dictionary<string, string> { 
      { "Name", u.Name }, 
      { "LastName", u.LastName } 
     }; 
相關問題