簡體   English   中英

C# linq 組到一個列表里面一個列表

[英]C# linq group to a list inside a list

我有以下 class

public class UserManagementClass
    {
        public string userID;
        List<AgencyInfo> UserAgencyList;
    }

    public class AgencyInfo
    {
        public string userAgency;
        public string userAgencyName;
    }

現在這個列表可以有多個具有相同用戶 ID 的實例,SQL 返回如下列表:

 userID        userAgency      userAgencyName
    1           5    Milk Commission
    2           5    Milk Commission
    2           2    Department Of CSV

我將其翻譯為:

[{
    "userID": "1",
    "AgencyInfo": [
        {
            "userAgency": "5",
            "userAgencyName": "Milk Commission"
        }
    ]
},
{
    "userID": "2",
    "AgencyInfo": [
        {
            "userAgency": "5",
            "userAgencyName": "Milk Commission"
        }
    ]
},
{
    "userID": "2",
    "AgencyInfo": [
        {
            "userAgency": "2",
            "userAgencyName": "Department Of CSV"
        }
    ]
}]

如何使用 Linq 將其分組為如下所示:

 [{
    "userID": "1",
    "AgencyInfo": [
        {
            "userAgency": "5",
            "userAgencyName": "Milk Commission"
        }
    ]
},
{
    "userID": "2",
    "AgencyInfo": [
        {
            "userAgency": "5",
            "userAgencyName": "Milk Commission"
        },
        {
            "userAgency": "2",
            "userAgencyName": "Department Of CSV"
        }
    ]
}]

我嘗試使用多個非查詢表達式但沒有運氣,有人可以指出我正確的方向嗎?

我的 Linq:

var UsersList = Users.GroupBy(u => u.userID).ToList();

使用GroupBy ,然后使用Select定義您希望如何投影分組結果。

List<UserManagementClass> UsersList = Users
    .GroupBy(u => u.userID)
    .Select(_ => new UserManagementClass
    {
        userID = _.Key,
        UserAgencyList = _.SelectMany(u => u.UserAgencyList.Select(agency => agency)).ToList()
    }).ToList();

對您的數據庫使用 Linq 應該很簡單(Linq To SQL,Linq To EF)。 我希望在您的數據庫中它也表示為與您的 JSON 匹配的 2 個表,但是看起來您正在從單個表中檢索該數據?

然后你可以達到相同的效果:

var myUsers = Users.GroupBy(u => u.UserID)
    .Select(g => new
    {
        UserId = g.Key,
        AgencyInfo = g.Select(tb => new { tb.UserAgency, tb.UserAgencyName })
    });

使用 Newtonsoft 將其序列化為 JSON 給出:

[
{
 "UserId":1,
 "AgencyInfo":[
     {
       "UserAgency":5,
       "UserAgencyName":"Milk Commission"
     }
  ]
},
{
 "UserId":2,
 "AgencyInfo":[
   {
     "UserAgency":5,
     "UserAgencyName":"Milk Commission"
   },
   {
     "UserAgency":2,
     "UserAgencyName":"Department Of CSV"
   }
 ]
}]

你的線:

var UsersList = Users.GroupBy(u => u.userID).ToList();

如果您添加:

UsersList = Users.GroupBy(u => u.userID.ToLowerInvariant()).ToList();

由於您的 userId 被聲明為字符串,因此 groupBy 嚴格分組。

如果您的 userId 將由數字組成,我會將其更改為 int 或類似的。 否則,如果它需要是字符串,您最好在 GroupBy 之后使用 a.Select 並使用這兩個屬性創建一個新的 UserManagementClass,類似於 Igor 的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM