9

可能重复:
是否可以使用 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

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

4

4 回答 4

4

您需要一个运行时类来保存这些运行时结果。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))
    )
  )
);

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

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

于 2008-11-26T15:09:52.337 回答
1

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

于 2008-11-26T14:59:41.563 回答
1

您可以尝试使用 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

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

于 2009-04-01T18:33:12.857 回答
1
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()
                     }
于 2009-10-07T09:05:49.763 回答