7
votes

Linq à SQL - Ordonnance dynamique par cas lorsque

J'utilise linq à SQL forte> et linq dynamique strong> ordonnance de commande.

Je sais que dynamique de Linq peut faire un tri simple comme - Orderby ("Nom de colonne" ). strong> p>

mais prend-il en charge quelque chose de plus complexe comme des requêtes avec "cas quand" en eux? strong> p> xxx pré> Voici ma requête: P>

var u = from u in db.users
        orderby(orderbyQuery)
        select u;


0 commentaires

3 Réponses :


11
votes
var u = from u in db.users
        orderby u.username == 100 ? 1 : 0 descending
        select u;

2 commentaires

Je dois utiliser une requête dynamique car, j'ai un int [] réalisateur = 100, 22, 77, 12, etc ... Je veux trier la table des utilisateurs en fonction de celui de [], ce qui signifie que les utilisateurs sont d'abord dans "Realusers" d'abord .


Vous pouvez remplacer ce nom u.username == 100? 1: 0 avec (presque) toute logique que vous souhaitez pour la commande, vous l'écrivez essentiellement en C # au lieu de SQL. Sans savoir exactement comment vous essayez de commander qu'il est difficile de donner un meilleur exemple que de convertir votre code d'origine ...



1
votes

Cela fonctionne vraiment pour moi: xxx

espère que cela aide!


0 commentaires

1
votes
public static Expression<Func<TEntity, int>> CustomSortOrder<TEntity>(this IList<string> customSortOrderValues, string propName) {

var e = Expression.Parameter(typeof(TEntity), "e");
var prop = typeof(TEntity).GetProperty(propName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
var eDotProp = Expression.MakeMemberAccess(e, prop);
var maxLen = customSortOrderValues.Count;

Expression ElseExpression(IList<string> values) {
    var value = values[0];
    var condition = Expression.Equal(eDotProp, Expression.Constant(value));
    var ifTrue = Expression.Constant(maxLen - values.Count);
    Expression ifFalse ;

    if (values.Count == 1) {
        ifFalse = Expression.Constant(maxLen - values.Count + 1);
    }
    else {
        values.RemoveAt(0);
        ifFalse = ElseExpression(values);
    }
    return Expression.Condition(condition, ifTrue, ifFalse);
}

return Expression.Lambda<Func<TEntity, int>>(
    ElseExpression(customSortOrderValues),
        e);
}

2 commentaires

Y a-t-il un moyen de faire de Linq à SQL créer une déclaration de cas unique et de ne pas avoir de nombreuses nichées comme ça? J'ai une vaste déclaration de cas qui, quand jeté, dépasse la limite de nidification et que le SQL échoue. Ou est-ce juste un bug de Linq sans travail?


Je ne pense pas que vous devriez faire cette solution si le nombre de cas est très élevé. Ceci est une solution d'arrêt de l'écart lorsque vous souhaitez combiner la commande d'une autre source que la source de la table et un nombre très limité de CAESS.