J'ai une table simple dans la structure suivante.
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. P>
J'ai essayé de base Linq mais pas de chance. Toute aide est très appréciée. P>
classe: p> tentative: Ce rendement résultat groupé par la priorité. Mais je veux inclure la logique dont j'avais besoin dans cette expression. P> p> dBContext.Options code> créerait une connexion à la table de base de données via Orm et Nous pouvons appliquer des expressions Linq là-bas. p> dbcontext.option.orderbytescendants (o => o.priority) .groupby (a => a.priority) code> p> p>
5 Réponses :
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();
Il devrait être bon en termes de performance. P>
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: p>
xxx pré> performance maximale et linq va rarement la main la main quand il s'agit de dieriser des bases de données. P> blockQuote>
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);
}
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.
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();
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 code> avecprendre code>. Donnez-lui un coup et essayez-le vous-même. N'oubliez pas de poster le résultat et B> Tentative d'expression de votre question.