我的数据库中有一个键/值表,我会返回一个字典列表。 以下代码对我来说很好,但是有很多数据没有执行。
注意:r.name不包含唯一值
List<Dictionary<string, string>> listOutput = null;
using (ExampleDB db = new ExampleDB())
{
var result = (from r in db.FormField
where r.Form_id == 1
select new { r.ResponseId, r.name, r.value}).toList();
listOutput = new List<Dictionary<string, string>>();
foreach (var element in result)
{
listOutput.Add((from x in listOutput
where x.ResponseId == element.ResponseId
select x).ToDictionary(x => x.name, x => x.value));
}
}
return listOutput;
您对如何改进此代码有什么建议吗?
答案 0 :(得分:4)
我怀疑你想要的东西是:
List<Dictionary<string, string>> result;
using (var db = new ExampleDB())
{
result = db.FormField
.Where(r => r.Form_id == 1)
.GroupBy(r => r.ResponseId, r => new { r.name, r.value })
.AsEnumerable()
.Select(g => g.ToDictionary(p => p.name, p => p.value))
.ToList();
}
换句话说,我们会对r.Form_id == 1
进行过滤,然后按ResponseId
进行分组...获取与每个ID关联的所有名称/值对,并根据这些名称创建字典/值对。
请注意,您正在丢失词典列表中的ResponseId
- 您无法告诉哪个词典对应哪个回复ID。
AsEnumerable
部分是为了确保使用LINQ to Objects执行最后一个Select
,而不是尝试将其转换为SQL。 可能它可以在没有AsEnumerable
的情况下工作,但它至少取决于您的提供商。
答案 1 :(得分:0)
根据我收集的内容,您尝试根据每个ResponseId
创建一个键/值对列表。试试GroupBy
:
var output = result.GroupBy(r => r.ResponseId)
.Select(r => r.ToDictionary(s => s.Name, s => s.Value));
这将返回IEnumerable<Dictionary<string,string>>
,如果您确实需要列表,则可以ToList
。