【问题标题】:Using Linq to create crosstab results [duplicate]使用 Linq 创建交叉表结果 [重复]
【发布时间】:2010-09-24 04:02:52
【问题描述】:

可能重复:
Is it possible to Pivot data using LINQ?

我想知道是否可以使用 Linq 创建交叉表样式的结果。 我有一些如下所示的数据:

    var list = new[]
    {
        new {GroupId = 1, Country = "UK", Value = 10},
        new {GroupId = 1, Country = "FR", Value = 12},
        new {GroupId = 1, Country = "US", Value = 18},
        new {GroupId = 2, Country = "UK", Value = 54},
        new {GroupId = 2, Country = "FR", Value = 55},
        new {GroupId = 2, Country = "UK", Value = 56}
    };

我正在尝试输出到中继器控件,如下所示:

GroupId.....UK.....FR.....US
1...........10.....12.....18
2...........54.....55.....56

它是导致我的问题的动态列。有什么解决办法吗?

【问题讨论】:

  • 这个问题是询问关于未知结果列的透视。建议的副本是针对已知结果列的枢纽。这两种情况是完全不同的。投票重新开放。

标签: linq crosstab


【解决方案1】:

您需要一个运行时类来保存这些运行时结果。 xml呢?

XElement result = new XElement("result",
  list.GroupBy(i => i.GroupId)
  .Select(g =>
    new XElement("Group", new XAttribute("GroupID", g.Key),
      g.Select(i => new XAttribute(i.Country, i.Value))
    )
  )
);

您是否希望每个结果单元格有多个记录?如果是这样,则需要在其中进行一些求和(以及更多分组)。

(这个答案是概念证明,而不是最终结果。有几个问题需要解决,例如:列的顺序、单元格缺失等)。

【讨论】:

    【解决方案2】:

    快速搜索后,您可能想查看 System.Reflection.Emit 中的 ModuleBuilder、TypeBuilder 和 FieldBuilder 类。它们允许您在运行时动态创建一个类。除此之外,您需要对对象进行分组,然后对从 LINQ 获得的分层结果进行一些处理。我不确定在运行时动态创建匿名类型字段的方法,这听起来像是需要发生的事情。

    【讨论】:

    • 你能告诉我为什么这被否决了吗?我哪里不对?
    【解决方案3】:

    您可以尝试使用 MS 提供的动态 linq 库。它们对以字符串作为参数的扩展方法有许多重载。他们还有一个表达式解析器,它接受一个字符串并发出一个 lambda 表达式。您应该能够使用它们创建动态选择。

    但请注意,您最终会得到一个非泛型 IQueryable 而不是泛型 IQueryable,因此您对结果的处理方式有些限制,并且您放弃了一点类型安全性,但是这在您的应用程序中可能没问题...

    动态 linq 的链接是

    http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

    有一个链接可以下载动态库的源代码,还有一些很好的说明如何使用它。

    【讨论】:

      【解决方案4】:
      var labResults = from lab in CoreLabResults
                       where lab.Patient == 8
                       group lab by new { lab.Patient, lab.TestNo, lab.CollectedDate }
                           into labtests
                           select new
                           {
                               labtests.Key.Patient,
                               labtests.Key.TestNo,
                               labtests.Key.CollectedDate,
                               MCHC = labtests.Where(lab => lab.TestVar == "MCHC").FirstOrDefault().Result,
                               LYABS = labtests.Where(lab => lab.TestVar == "LYABS").FirstOrDefault().Result,
                               TotalTests = labtests.Count()
                           }
      

      【讨论】:

      • 一个简单的解决方案.. 但它不会在你不知道“实验室”有什么价值的地方工作。
      猜你喜欢
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2014-04-07
      • 2013-03-29
      • 1970-01-01
      相关资源
      最近更新 更多