[英]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.