【问题标题】:Use Linq to flatten name/value collection使用 Linq 扁平化名称/值集合
【发布时间】:2015-11-19 05:08:03
【问题描述】:

下面的 IGrouping 结果显示了一些示例表单数据。我将名称/值对存储在数据库中以收集表单数据。下面的数据是我从填写表单的用户那里收集的基本示例。

我想要一个 linq 查询或 SQL 查询来提供此数据的扁平化版本。以 csv 数据为例:

FirstName,LastName,Email,EmailVerify,Meta
sdfsdf,sdfsdf,yu@yu.com,yu@yu.com,

记录通过EntryKey关联。我怎样才能像上面的例子那样得到结果数据?谢谢。

【问题讨论】:

  • 如果我输入我的名字为this,is,my,name 会怎样?
  • Erik - 我只是使用 CSV 格式作为数据结构通信的一种方式。假设这一切都被擦洗了。 CSV 会将其放在引号中,这就是解决方案。
  • 如果在此之前您要过滤特定的EntryKey,为什么要按EntryKey 分组?您的组将仅包含一个父项。
  • 如果您的查询正在过滤键,为什么要对数据进行分组?好像已经按过滤器分组了。
  • 您可以使用 SQL 做得更好...特别是如果您的列字段名称是固定的。查看PIVOT 关键字。然后使用.ExecuteQuery<T>(…) 并传入一个属性名称与您的字段匹配的类。 technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspxmsdn.microsoft.com/en-us/library/bb361109(v=vs.110).aspx

标签: c# sql linq


【解决方案1】:

我认为您应该能够执行以下操作:

var results = db.EntryDetails
  .GroupBy(ed => ed.EntryKey)
  .ToList()
  .Select(ek => new List<List<string>>()
    {
      ek.Select(gb => gb.DetailName).ToList(),
      ek.Select(gb => gb.DetailValue).ToList()
    });
  .SelectMany(ed => ed)
  .ToList();

结果将是List&lt;List&lt;string&gt;&gt;

第一个List&lt;&gt; 是每一行。

每个列表的内容都是List&lt;string&gt; 的列。

【讨论】:

  • Erik - 我并不想生成 CSV 输出本身 - 我只是展示了一个 CSV 格式的输出示例,以显示我希望如何输出记录集。
【解决方案2】:

您可以使用 XML 或 JSON 序列化来实现这一点。序列化后你可以很容易地将数据转换成纯文本

以下链接帮助您编写序列化和反序列化代码。

更新 要动态获取属性,您可以使用ExpandoObject(使用 System.Dynamic 命名空间),这将帮助您动态定义属性。生成后,您可以将其序列化为指定的类型。以下是有帮助的示例代码。

    var xNewExpando = new ExpandoObject() as IDictionary<string, Object>;

    foreach (var adv in advocateDetails)
    {
        xNewExpando.Add(adv.DetailName, adv.DetailValue);
    }

    var yourString = JsonConvert.SerializeObject(xNewExpando);

【讨论】:

  • 谢谢 Totalo,我知道如何序列化数据,但我试图将对象视为动态对象并根据 DetailName 字段设置属性。
  • 感谢您指出。我已经更新了我的答案以满足您的期望。请让我知道这是否适合您
猜你喜欢
  • 2021-11-19
  • 2012-08-27
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2022-01-23
  • 2015-09-03
相关资源
最近更新 更多