1
votes

Groupe C # linq vers une liste dans une liste

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;
    }


4 commentaires

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.


3 Réponses :


4
votes

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();


2 commentaires

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



0
votes

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 })
    });


0 commentaires

-1
votes

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.


0 commentaires