2010-08-01 173 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 } 
     }; 
相关问题