1
votes

Comment utiliser Where, Group By, Select et OrderBy dans la même requête linq?

Linq

public ActionResult getParceiros(){
            //return all partners
            IList<ViewParceirosModel> lista = new List<ViewParceirosModel>();
            lista = context.usuarios.Where(u => u.perfil == RoleType.Parceiro)
                                    .Select(x => new ViewParceirosModel
                                    {
                                        id = x.id,
                                        nomeParceiro = x.nome,
                                        emailAcesso = x.email
                                    })
                                    .GroupBy(x => x.id)
                                    .OrderBy(x => x.nomeParceiro)
                                    .ToList();



            return View(lista);
        }

 entrez la description de l'image ici a >


4 commentaires

Je pense que mettre OrderBy avant le GroupBy vous donnera ce que vous voulez.


Un groupby crée un tableau bidimensionnel >. Donc, tout ce que vous avez à faire est de placer le OrderBy avant le GroupBy. Le GroupBy maintiendra l'ordre.


Une option consiste à utiliser la syntaxe de requête comme (à partir de u dans context.usuarios où (u.perfil == RoleType.Parceiro) Select (x => new ViewParceirosModel {id = x.id, nomeParceiro = x.nome, emailAcesso = x.email}) GroupBy (x => x.id) dans groupList de g dans groupList OrderBy (x => x.nomeParceiro) sélectionnez g) .ToList ();


Pouvez-vous nous donner votre ViewParceirosModel ?


4 Réponses :


1
votes

Lorsque vous créez une requête LINQ avec une clause group by, vous recevez comme résultat une requête groupée. C'est une sorte de dictionnaire qui a pour clé le champ que vous avez choisi de grouper et comme valeur une liste d'enregistrements de ce groupe.

Donc, vous ne pouvez pas commander par "nomeParceiro" car ce champ est à l'intérieur du groupe.

Si vous expliquez comment vous attendez le résultat, je peux vous montrer un exemple de code pour cela.

Vous pouvez trouver plus de détails dans cette section du document: https://docs.microsoft.com/pt-br/dotnet/csharp/linq/group-query-results


0 commentaires

1
votes

Vous pouvez utiliser le code suivant.

 List<List<ViewParceirosModel>> listb = context.usuarios
            .Where(u => u.perfil == RoleType.Parceiro)
            .GroupBy(g => g.id).OrderBy(g => g.Key)
            .Select(g => g.OrderBy(x => x.nomeParceiro)).ToList();

ou

IList<ViewParceirosModel> lista = new List<ViewParceirosModel>();

lista = context.usuarios.Where(u => u.perfil == RoleType.Parceiro)
            .Select(x => new ViewParceirosModel
            {
                id = x.id,
                nomeParceiro = x.nome,
                emailAcesso = x.email
            })
            .OrderBy(x => x.nomeParceiro)
            .GroupBy(x => x.id)
            .ToList();


0 commentaires

1
votes

Disons que ViewParceirosModel ressemble à

IList<ViewParceirosModel> lista = new List<ViewParceirosModel>();

lista = context.usuarios.Where(u => u.perfil == RoleType.Parceiro)
        .Select(x => new ViewParceirosModel
        {
            id = x.id,
            nomeParceiro = x.nome,
            emailAcesso = x.email
        })
        .GroupBy(x => x.id)
        .Select(g => new ViewParceirosModel 
        { 
           id = g.Key, 
           nomeParceiro = g.Select(p => p.nomeParceiro).OrderBy(x => x.nomeParceiro).ToList()
           nomeParceiro = g.Select(p => p.emailAcesso).ToList()
         }) 
        .ToList();

Après cela, vous pouvez Grouper puis sélectionner Combiner avec Orderby code > comme ci-dessous

public class ViewParceirosModel 
{
   public int id {get; set;}
   public List<string> nomeParceiro {get; set;}
   public List<string> emailAcesso {get; set;}
}


0 commentaires

1
votes

Votre programme ne fait pas ce que vous voulez. Hélas tu as oublié de te dire ce que tu voulais, tu ne nous as montré que ce que tu ne voulais pas. Nous devrons deviner.

Vous avez donc une séquence d'Usarios.

List<ViewParceirosModel> viewParceiroModels = Usarios
    .Where(usario => usario.Perfil == RoleType.Parceirdo)
    .Select(usario => new ViewParceirosModel
    {
        Id = x.id,
        NomeParceiro = x.nome,
        EmailAcesso = x.email,
    }
    .OrderBy(viewParceirosModel => viewParceirosModel.NomeParceiro)
    .ToList();

Je n'ai pas besoin de savoir ce qu'est un Usario, tout ce que j'ai besoin de savoir est qu'il a certaines propriétés.

Votre première étape consiste à jeter certains Usarios en utilisant : vous ne voulez conserver que les Usarios qui ont un Perfil égal à RoleType.Parceirdo:

var result = usarios.Where(usario => usario.Perfil == RoleType.Parceirdo)
    .Select(usario => new ViewParceirosModel
    {
        Id = x.id,
        NomeParceiro = x.nome,
        EmailAcesso = x.email,
    })

en mots: de la séquence des Usarios ne gardez que les Usarios qui ont un Perfil égal à RoleTyoe.Parceirdo.

Le résultat est un sous-ensemble d'Usarios, c'est une séquence d'Usarios.

À partir de chaque Usario de ce résultat, vous voulez sélectionner certaines propriétés et les mettre dans un ViewParceirosModel:

// keep only the Usarios with the Perfil equal to RoleType.Parceirdo:
var result = usarios.Where(usario => usario.Perfil == RoleType.Parceirdo)

En mots: de chaque Usario qui a été conservé après votre Où, prenez l'Id, le Nome et l'Email pour créer un nouveau ViewParceirosModel.

Le résultat est une séquence de ViewParceirosModels. Si vous ajoutez ToList (), vous pouvez affecter le résultat à vos listes de variables.

Cependant, votre GroupBy gâche le plaisir

Je ne sais pas quoi vous avez prévu de le faire, mais votre GroupBy, change votre séquence de ViewParceirosModels en une séquence de "groupes de ViewParceirosModels". Chaque ViewParceirosModel d'un groupe a le même identifiant, la valeur de cet identifiant est dans la clé.

Donc, si après le GroupBy vous avez un groupe de ViewParceirosModel avec une clé == 1, alors vous savez que chaque ViewParceirosModel de ce groupe aura un Id égal à 1.

De même tous les ViewParceirosModel du groupe avec Key 17, aura un Id égal à 17.

Je pense que l'Id est votre clé primaire, il n'y aura donc qu'un seul élément dans chaque groupe. Le groupe 1 aura le seul et unique ViewParceirosModel avec Id == 1, et le groupe 17 aura le seul et unique ViewParceirosModel avec Id == 17.

Si Id est unique, alors GroupBy est inutile. p>

Après le GroupBy, vous souhaitez commander votre séquence de ViewParceirosModels dans NomeParceiro ascendant.

Condition

J'ai une séquence d'Usarios. Je veux seulement garder ces Usarios avec une valeur Perfil égale à RoleType.Parceirdo. À partir des autres scénarios d'utilisation, je souhaite utiliser les valeurs des propriétés Id / Nome / Email pour créer ViewParceirosModels. La séquence restante de ViewParceirosModels doit être triée par NomeParceiro, et le résultat doit être mis dans une liste.

IQueryable<Usario> usarios = ...


0 commentaires