-2
votes

Query de Linq à collecter avec une limite

J'ai une table simple dans la structure suivante.

 Entrez la description de l'image ici

Je veux écrire une expression LINQ pour obtenir seulement 5 enregistrements toujours. Ce 5 devrait être "or" si disponible. Sinon ajoutez "bronze" pour en faire 5. S'il n'est toujours pas 5, ajoutez "argent" à la liste. Mais le total des résultats renvoyés devrait être 5. Cela devrait être bon en termes de performance.

J'ai essayé de base Linq mais pas de chance. Toute aide est très appréciée.

classe: xxx

dBContext.Options créerait une connexion à la table de base de données via Orm et Nous pouvons appliquer des expressions Linq là-bas.

tentative: dbcontext.option.orderbytescendants (o => o.priority) .groupby (a => a.priority)

Ce rendement résultat groupé par la priorité. Mais je veux inclure la logique dont j'avais besoin dans cette expression.


3 commentaires

S'il vous plaît montrer votre tentative de mieux illustrer votre description;)


Oui, veuillez montrer du code. Comme comment vous obtenez les données de la table dans c #.


Indice: Combinez OrderBy avec prendre . Donnez-lui un coup et essayez-le vous-même. N'oubliez pas de poster le résultat et Tentative d'expression de votre question.


5 Réponses :


2
votes

Vous souhaitez affecter une valeur de tri à chaque chaîne afin qu'elles soient commandées. Vous pouvez le faire en attribuant l'entier 0 à l'or, 1 à bronze, et 2 pour l'argent (autre).

Vous utilisez ensuite Prenez pour obtenir les 5 premiers enregistrements. P>

// ordered by gold, bronze, silver

var result = dbContext.Options
    .OrderBy(o => o.Priority == "Gold" ? 0 : o.Priority == "Bronze" ? 1 : 2)
    .Take(5)
    .ToList();


0 commentaires

1
votes

Il devrait être bon en termes de performance.

Ensuite, vous pourriez envisager d'utiliser SQL brut pour filtrer les enregistrements de la requête d'origine qui est exécutée contre la base de données, par exemple: xxx

performance maximale et linq va rarement la main la main quand il s'agit de dieriser des bases de données.


0 commentaires

1
votes

Laissez la priorité être une énumération, Ordonnez-vous et prenez 5.

        class Option
        {
            public int Id { get; set; }

            public string Name { get; set; }

            public Priority Priority { get; set; }
        }

        enum Priority
        {
            Gold = 0,
            Silver,
            Bronze
        }

        static void Main(string[] args)
        {
            var list = new List<Option>()
            {
                new Option { Id = 1, Name = "Bob", Priority = Priority.Gold },
                new Option { Id = 2, Name = "Rob", Priority = Priority.Gold },
                new Option { Id = 2, Name = "David", Priority = Priority.Bronze },
                new Option { Id = 2, Name = "Adam", Priority = Priority.Bronze },
                new Option { Id = 2, Name = "Jack", Priority = Priority.Silver },
                new Option { Id = 2, Name = "Josh", Priority = Priority.Silver },
                new Option { Id = 2, Name = "Peter", Priority = Priority.Silver },
                new Option { Id = 2, Name = "Max", Priority = Priority.Silver },
                new Option { Id = 2, Name = "Steve", Priority = Priority.Silver },
            };

            var newList = list.OrderBy(l => l.Priority).Take(5);
}


0 commentaires

1
votes
List<Option> top5 = participants.OrderBy(part => {
    switch(part.Priority) {
        case "Gold": return 1;
        case "Bronze": return 2;
        case "Silver": return 3;
        default: return 4;
    }
}).Take(5).ToList();
If the list is shorter than 5, just order them, if that is needed.

0 commentaires

1
votes

Voir le code ci-dessous:

            List<string> rank = new List<string>() { "Gold", "Bronze","Silver" };

            DataTable dt = new DataTable();

            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Priority", typeof(string));

            dt.Rows.Add(new object[] { 9, "Steve", "Silver" });
            dt.Rows.Add(new object[] { 8, "Max", "Silver" });
            dt.Rows.Add(new object[] { 7, "Peter", "Silver" });
            dt.Rows.Add(new object[] { 6, "Josh", "Silver" });
            dt.Rows.Add(new object[] { 5, "Jack", "Bronze" });
            dt.Rows.Add(new object[] { 4, "Adam", "Bronze" });
            dt.Rows.Add(new object[] { 3, "David", "Gold" });
            dt.Rows.Add(new object[] { 1, "Bob", "Gold" });
            dt.Rows.Add(new object[] { 2, "Rob", "Gold" });

           DataRow[] results = dt.AsEnumerable().OrderBy(x => rank.IndexOf(x.Field<string>("Priority"))).Take(5).ToArray();


0 commentaires