J'utilise 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> var u = from u in db.users
orderby(orderbyQuery)
select u;
3 Réponses :
var u = from u in db.users orderby u.username == 100 ? 1 : 0 descending select u;
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 ...
Cela fonctionne vraiment pour moi: espère que cela aide! p> p> p>
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); }
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.