透过Linq

前端之家收集整理的这篇文章主要介绍了透过Linq前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Pivot data using LINQ5个
我正在使用LINQ-to-Entities,并希望执行一个支点.

例如,我有这个表:

  1. | data1 | data2 |
  2. +-------+-------+
  3. | 1 | A |
  4. | 1 | B |
  5. | 2 | P |
  6. | 2 | Q |
  7. | 2 | R |
  8. +---------------+

我想将其转换为以下结果:

  1. | data1 | first | second | third |
  2. +-------+-------+--------+-------+
  3. | 1 | A | B | NULL |
  4. | 2 | P | Q | R |
  5. +--------------------------------+

我想在LINQ中执行此操作,而无需进行客户端处理.

我看过这些SO帖子,但是他们并没有完全解决上述情况(据我所知).

> Pivot data using LINQ
> Is it possible to Pivot data using LINQ?

注意
我已经尝试了下面的内容,但它抱怨我不能在无序集合上使用Skip(),而且我没有看到一种方法来对该组的折叠’data2’信息进行排序.

  1. from item in MyTable
  2. group item by item.data1 into g
  3. select new
  4. {
  5. data1 = g.Key,first = g.Skip(0).FirstOrDefault().data2,second = g.Skip(1).FirstOrDefault().data2,third = g.Skip(2).FirstOrDefault().data2,};

解决方法

我假设你可以从data2字段中有三列以上的列?

如果是这样,则无法进行查询,返回具有可变数量属性的匿名类型.您需要为data2值集返回一个数组或某种列表.

我认为这是你可以做的事情:

  1. var query =
  2. from mt in MyTable
  3. group mt.data2 by mt.data1 into gmts
  4. let d2 = gmts.ToArray()
  5. select new
  6. {
  7. data1 = gmts.Key,data2 = d2,length = d2.Length,};
  8.  
  9. var pending = query.ToArray();
  10.  
  11. var maxLength = pending.Max(p => p.length);
  12.  
  13. Func<string[],string[]> extend = xs =>
  14. {
  15. var r = new string[maxLength];
  16. xs.CopyTo(r,0);
  17. return r;
  18. };
  19.  
  20. var results =
  21. from p in pending
  22. select new
  23. {
  24. p.data1,data2 = extend(p.data2),};

这会产生一系列匿名类型,其中data2数组的大小都相同,以适应任何data1字段的最大结果数.

查询仍作为单个SQL查询执行.而内存处理速度很快.

这对你有用吗?

编辑

由于您知道自己拥有固定数量的列(根据评论),因此您可以轻松更改我的结果查询以满足您的要求:

  1. var results =
  2. from p in pending
  3. let d2s = extend(p.data2)
  4. select new
  5. {
  6. p.data1,first = d2s[0],second = d2s[1],third = d2s[2],};

猜你在找的MsSQL相关文章