参见英文答案 >
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],};