参见英文答案 >
Pivot data using LINQ5个
我正在使用LINQ-to-Entities,并希望执行一个支点.
我正在使用LINQ-to-Entities,并希望执行一个支点.
例如,我有这个表:
- | data1 | data2 |
- +-------+-------+
- | 1 | A |
- | 1 | B |
- | 2 | P |
- | 2 | Q |
- | 2 | R |
- +---------------+
我想将其转换为以下结果:
- | data1 | first | second | third |
- +-------+-------+--------+-------+
- | 1 | A | B | NULL |
- | 2 | P | Q | R |
- +--------------------------------+
我想在LINQ中执行此操作,而无需进行客户端处理.
我看过这些SO帖子,但是他们并没有完全解决上述情况(据我所知).
> Pivot data using LINQ
> Is it possible to Pivot data using LINQ?
注意
我已经尝试了下面的内容,但它抱怨我不能在无序集合上使用Skip(),而且我没有看到一种方法来对该组的折叠’data2’信息进行排序.
- from item in MyTable
- group item by item.data1 into g
- select new
- {
- data1 = g.Key,first = g.Skip(0).FirstOrDefault().data2,second = g.Skip(1).FirstOrDefault().data2,third = g.Skip(2).FirstOrDefault().data2,};
解决方法
我假设你可以从data2字段中有三列以上的列?
如果是这样,则无法进行查询,返回具有可变数量属性的匿名类型.您需要为data2值集返回一个数组或某种列表.
我认为这是你可以做的事情:
- var query =
- from mt in MyTable
- group mt.data2 by mt.data1 into gmts
- let d2 = gmts.ToArray()
- select new
- {
- data1 = gmts.Key,data2 = d2,length = d2.Length,};
- var pending = query.ToArray();
- var maxLength = pending.Max(p => p.length);
- Func<string[],string[]> extend = xs =>
- {
- var r = new string[maxLength];
- xs.CopyTo(r,0);
- return r;
- };
- var results =
- from p in pending
- select new
- {
- p.data1,data2 = extend(p.data2),};
这会产生一系列匿名类型,其中data2数组的大小都相同,以适应任何data1字段的最大结果数.
这对你有用吗?
编辑
由于您知道自己拥有固定数量的列(根据评论),因此您可以轻松更改我的结果查询以满足您的要求:
- var results =
- from p in pending
- let d2s = extend(p.data2)
- select new
- {
- p.data1,first = d2s[0],second = d2s[1],third = d2s[2],};