LINQ的返回的IEnumerable <字典<字符串,字符串>>
我需要返回动态创建的字典的IEnumerable。LINQ的返回的IEnumerable <字典<字符串,字符串>>
伪代码:
var x = from u in Users
select new dictionary<string, string>{
Add("Name",u.Name),
Add("LastName",u.LastName)
}
我一直想多种途径获得以上,但没有成功的伪代码示例...
我会很感激你的帮助。
var x = from u in Users
select new Dictionary<string, string> {
{ "Name", u.Name },
{ "LastName", u.LastName }
};
这件事情没有奏效。抛出此异常,无法识别的表达式节点:ListInit 我尝试添加和删除后()词典并没有成功...任何想法... – Tony 2010-08-03 05:52:42
@Tony,@mquander,在Users.AsEnumerable尝试'从u ()'as'Users'可能是'IQueryable',它试图转换SQL脚本中的整个LINQ语句。 – 2010-08-04 05:51:03
这是对字典的糟糕用法 - 您只能将它用作属性包,并创建与用户一样多的字典。
更好的使用的语言将与这些属性创建自己的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 });
我完全明白这是一个非常糟糕的用途,但我不能为我的情况提供更好的解决方案。这是整个场景......我正在创建一系列电子邮件模板。我想用regex ex动态替换一些文本:“Dear [[Name]]” - > Replace([[Name]],Dictionary [Name] ...问题是我有多个实体可以从中收集数据。伪代码只是使用实体用户,但我可能有我使用User,UserCredit,UserAddress ...的情况,所以我只想返回那些在我的电子邮件模板中需要的字段,匿名类会强制我使用反射。 。 – Tony 2010-08-01 05:30:53
BTW,您的例子就像一个魅力。谢谢了Kobi – Tony 2010-08-01 05:38:24
我做了类似的事情最近,和有一个更复杂的解决方案。如果你在同一个模板需要不同的实体?'“你好[名],你”已经下令[ItemsCount]项目在$ [ItemsPrice]。请参阅Terms of Use“'。我曾与'User','Order'等一个'OrderContext'类,它可以用适当的字符串替换标记。这可能比将每个实体转换为字典更好。 – Kobi 2010-08-01 05:38:35
转换方法:
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);
你得到的“无法识别的表达式节点”的错误是因为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 }
};
您能否描述一下你在做什么? IEnumerable>似乎有点奇怪,特别是当你必须硬编码所有元素时。 –
Kobi
2010-08-01 05:28:36