2014-12-03 96 views
0

我有一个键/值表在我的数据库,我将返回字典的列表。 下面的代码适用于我,但有很多数据没有执行。从列表中提高转化为List <词典<字符串,字符串>>使用LINQ

注: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; 

你有关于如何提高这个代码的建议吗?

+1

您添加到基于现有的名单,这似乎很奇怪,我的列表中。我不明白你想要做什么 - 你能给出一个输入数据样本和预期结果吗? – 2014-12-03 18:22:02

+0

我不确定我能理解你为什么选择字典清单。为什么不创建一个自定义类来保存变量? – paqogomez 2014-12-03 18:22:11

回答

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部分是为了确保最后Select使用LINQ执行对象,而不是尝试将其转换为SQL。这是可能它将没有AsEnumerable工作,但它将至少是取决于你的供应商。

+0

准确!关于ResponseId你是对的...有没有办法将它包含在字典中? 关于性能非常好...响应时间不到一秒 – 2014-12-04 15:19:57

+0

@EmanueleTramutola:如果你想要一个'List >',那么不行,因为没有地方可以放它。您可能想为此创建一个单独的类型,例如'Response',其中*包含*一个响应ID和一个字典...然后你的返回类型将是'List '。 – 2014-12-04 15:21:00

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如果你确实需要一个清单。

+1

尽管这应该“逻辑上”起作用,但我怀疑大多数LINQ提供商不会支持该“Select”调用。我可能是错的,但:) – 2014-12-03 18:28:32

相关问题