J'ai la classe suivante
var UsersList = Users.GroupBy(u => u.userID).ToList();
Maintenant, cette liste peut avoir plusieurs instances avec le même ID utilisateur, SQL renvoie une liste comme celle-ci:
[{
"userID": "1",
"AgencyInfo": [
{
"userAgency": "5",
"userAgencyName": "Milk Commission"
}
]
},
{
"userID": "2",
"AgencyInfo": [
{
"userAgency": "5",
"userAgencyName": "Milk Commission"
},
{
"userAgency": "2",
"userAgencyName": "Department Of CSV"
}
]
}]
Ce que je traduis en ceci:
[{
"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"
}
]
}]
Comment puis-je le grouper pour qu'il ressemble à ceci en utilisant Linq:
userID userAgency userAgencyName
1 5 Milk Commission
2 5 Milk Commission
2 2 Department Of CSV
J'ai essayé d'utiliser plusieurs expressions sans requête mais pas de chance. Quelqu'un pourrait-il me diriger dans la bonne direction?
Mon Linq:
public class UserManagementClass
{
public string userID;
List<AgencyInfo> UserAgencyList;
}
public class AgencyInfo
{
public string userAgency;
public string userAgencyName;
}
3 Réponses :
Utilisez GroupBy , puis Select pour définir comment vous voulez que les résultats groupés soient projetés.
List<UserManagementClass> UsersList = Users
.GroupBy(u => u.userID)
.Select(_ => new UserManagementClass
{
userID = _.Key,
UserAgencyList = _.SelectMany(u => u.UserAgencyList.Select(agency => agency)).ToList()
}).ToList();
comment pourrais-je sélectionner plusieurs colonnes dans ce cas: .Select (_ => new UserManagementClass {userID = _.Key, userName = ...?
@AyoubSalhi - Sont-ils uniques à l'utilisateur? Si tel est le cas, incluez-les dans GroupBy en tant que new {u.userId, u.userName} , puis sélectionnez-les dans _.Key.userId
Cela devrait être simple en utilisant Linq contre votre base de données (Linq To SQL, Linq To EF). Je m'attendrais à ce que votre base de données soit également représentée sous la forme de 2 tables qui correspondent à votre JSON, mais il semble que vous récupériez ces données à partir d'une seule table?
Ensuite, vous pourriez obtenir la même chose que:
[
{
"UserId":1,
"AgencyInfo":[
{
"UserAgency":5,
"UserAgencyName":"Milk Commission"
}
]
},
{
"UserId":2,
"AgencyInfo":[
{
"UserAgency":5,
"UserAgencyName":"Milk Commission"
},
{
"UserAgency":2,
"UserAgencyName":"Department Of CSV"
}
]
}]
Sérialiser ceci en JSON à l'aide de Newtonsoft donne ceci:
var myUsers = Users.GroupBy(u => u.UserID)
.Select(g => new
{
UserId = g.Key,
AgencyInfo = g.Select(tb => new { tb.UserAgency, tb.UserAgencyName })
});
votre ligne:
var UsersList = Users.GroupBy (u => u.userID) .ToList ();
fonctionnera si vous ajoutez:
UsersList = Users.GroupBy (u => u.userID.ToLowerInvariant ()). ToList ();
comme votre userId est déclaré sous forme de chaîne, le groupBy est strictement groupé.
Si votre userId doit être formé de nombres, je le changerais en int ou similaire. Sinon, s'il doit s'agir d'une chaîne, vous feriez peut-être mieux d'utiliser un .Select après le GroupBy et de créer une nouvelle UserManagementClass avec les deux propriétés, similaire à l'approche d'Igor.
Pouvez-vous partager votre LINQ?
GroupBy (x => x.userID)?@ SelimYıldız Je viens de l'inclure
@HereticMonkey Cela ne renvoie pas "AgencyInfo" dans une liste par ID utilisateur.