鍍金池/ 問答/C#  網(wǎng)絡(luò)安全/ Linq中如何搜索并生成List中的List

Linq中如何搜索并生成List中的List

前提:

數(shù)據(jù)庫中有這樣兩個(gè)表:User和Score表。

User
id    name    班級    年齡
1    Young    一班    25
2    Hong     二班    24

Score
id    userId    course    score
10    1        數(shù)據(jù)結(jié)構(gòu)    100
11    1        高等數(shù)學(xué)    90
12    2        數(shù)據(jù)結(jié)構(gòu)    95
13    2        高等數(shù)學(xué)    85

當(dāng)前我通過這樣一句linq語句聯(lián)查:

(from u in User join s in Score
on u.id equals s.userId
select MapToEntity(u,s)).ToList());

private User MapToEntity(User u, Score s){
    u.score = s;
    return u;
}

聯(lián)查后得出的結(jié)果是這樣的:

{
    User{
        Young,一班,25,
        Score{
            10,1,數(shù)據(jù)結(jié)構(gòu),100
        }
    },
    User{
        Young,一班,25,
        Score{
            11,1,高等數(shù)學(xué),90
        }
    },
    User{
        Hong,二班,24,
        Score{
            12,2,數(shù)據(jù)結(jié)構(gòu),95
        }
    },
    User{
        Hong,二班,24,
        Score{
            13,2,高等數(shù)學(xué),85
        }
    }
}

問題

如何通過Linq搜索可以得出這樣的結(jié)果:

{
    User{
        Young,一班,25,
        Score{
            10,1,數(shù)據(jù)結(jié)構(gòu),100
        },
        Score{
            11,1,高等數(shù)學(xué),90
        }
    },
    User{
        Hong,二班,24,
        Score{
            12,2,數(shù)據(jù)結(jié)構(gòu),95
        },
        Score{
            13,2,高等數(shù)學(xué),85
        }
    }
}
回答
編輯回答
雨萌萌

我定義的類和你的不同:

class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Class { get; set; }
    public int Age { get; set; }
}

class Score
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public string Course { get; set; }
    public int Value { get; set; }
}

思路是先對分?jǐn)?shù)按照 UserId 進(jìn)行分組,然后再與 User 進(jìn)行連接操作。

from user in users
join scoreList in from score in scores
                  group score by score.UserId into scoreGroup
                  select new
                  {
                      UserId = scoreGroup.Key,
                      Scores = scoreGroup
                  } on user.Id equals scoreList.UserId
select new
{
    user.Name,
    user.Class,
    user.Age,
    scoreList.Scores
}

輸出為:

[
  {
    "Name": "Young",
    "Class": "一班",
    "Age": 15,
    "Scores": [
      {
        "Id": 10,
        "UserId": 1,
        "Course": "數(shù)據(jù)結(jié)構(gòu)",
        "Value": 100
      },
      {
        "Id": 11,
        "UserId": 1,
        "Course": "高等數(shù)學(xué)",
        "Value": 90
      }
    ]
  },
  {
    "Name": "Hong",
    "Class": "二班",
    "Age": 24,
    "Scores": [
      {
        "Id": 12,
        "UserId": 2,
        "Course": "數(shù)據(jù)結(jié)構(gòu)",
        "Value": 95
      },
      {
        "Id": 13,
        "UserId": 2,
        "Course": "高等數(shù)學(xué)",
        "Value": 85
      }
    ]
  }
]

代碼:

到 Ubuntu Pastebin 查看

2018年2月24日 07:16