使用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()
}