透过Linq

参见英文答案 > 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
> 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字段的最大结果数.

查询仍作为单个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],};

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...