Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Linq创建交叉表结果_Linq_Crosstab - Fatal编程技术网

使用Linq创建交叉表结果

使用Linq创建交叉表结果,linq,crosstab,Linq,Crosstab,可能重复: 我想知道是否有可能用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 {

可能重复:

我想知道是否有可能用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
我试图输出到中继器控件,如下所示:

    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

是动态列导致了我的问题。有什么解决方案吗?

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

您需要一个运行时类来保存这些运行时结果。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))
    )
  )
);
您是否希望每个结果单元格有多条记录?如果是这样的话,就需要进行一些总结(以及更多的分组)


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

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

不过,一句警告的话,您最终得到的是一个非泛型IQueryable,而不是泛型IQueryable,因此您对如何处理结果有一点限制,并且您放弃了一点类型安全性,但这在您的应用程序中可能还可以

动态linq的链接是


这里有一个链接,您可以从动态库中下载源代码,还有一些关于如何使用它的精美插图。

您能告诉我为什么否决了这个链接吗?我哪里错了?这个问题是关于针对未知结果列的透视。建议的副本是针对已知结果列的轴心。这两种情况完全不同。投票重新开放。一个简单的解决方案。。但如果你不知道“实验室”有什么价值,它就不会起作用。
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()
                     }