透过Linq
发布时间:2020-12-12 07:27:47 所属栏目:MsSql教程 来源:网络整理
导读:参见英文答案 Pivot data using LINQ5个 我正在使用LINQ-to-Entities,并希望执行一个支点. 例如,我有这个表: | data1 | data2 |+-------+-------+| 1 | A || 1 | B || 2 | P || 2 | Q || 2 | R |+---------------+ 我想将其转换为以下结果: | data1 | first
参见英文答案 >
Pivot data using LINQ5个
我正在使用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 注意 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字段的最大结果数. 该查询仍作为单个SQL查询执行.而内存处理速度很快. 这对你有用吗? 编辑 由于您知道自己拥有固定数量的列(根据评论),因此您可以轻松更改我的结果查询以满足您的要求: var results = from p in pending let d2s = extend(p.data2) select new { p.data1,first = d2s[0],second = d2s[1],third = d2s[2],}; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |