2010-11-25 20 views
3

J'utilise LINQ2SQL et son fonctionnement est plutôt bon. Cependant, en fonction de la valeur de la chaîne de type variable en C#, je dois utiliser "Order By" dans ma requête ou ne pas utiliser "order by".LINQ: Comment utiliser dynamiquement un ORDER BY dans linq mais seulement si une variable n'est pas string.empty ou null

Si la chaîne C# n'est pas NULL, ou vide, alors je veux "ordonner par" sur le contenu de la variable chaîne. Si la chaîne C# est vide ou nulle, je n'inclue pas de commande par.

Est-il possible d'écrire ce genre de requête?

+0

-vous Voulez-vous * exclure * ces éléments vides/nuls ou les trier en haut ou en bas? – strager

+0

Que contient la chaîne? Le nom du membre que vous souhaitez commander? Ou autre chose? – KristoferA

Répondre

2

Faites comme dans la réponse de VVS, mais si vous voulez passer au nom de la colonne pour commander vous pouvez utiliser cette méthode d'extension au lieu de la méthode OrderBy intégrée:

public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> query, string memberName) 
{ 
    ParameterExpression[] typeParams = new ParameterExpression[] { Expression.Parameter(typeof(T), "") }; 

    System.Reflection.PropertyInfo pi = typeof(T).GetProperty(memberName); 

    return (IOrderedQueryable<T>)query.Provider.CreateQuery( 
     Expression.Call( 
      typeof(Queryable), 
      "OrderBy", 
      new Type[] { typeof(T), pi.PropertyType }, 
      query.Expression, 
      Expression.Lambda(Expression.Property(typeParams[0], pi), typeParams)) 
    ); 
} 
+0

excellente méthode d'extension! merci ... je mets mes outils en ce moment :-) – Martin

2

Faites-en deux étapes:

var query = from .. in .. where .. select ..; 

if (!string.IsNullOrEmpty(someVariable)) 
{ 
    query = query.OrderBy((..) => ..); 
} 
+0

Je pense OP demandant, n'importe quelle variable dans la requête si null, alors pas d'ordre par. –

+0

@Serkan: "en fonction de la valeur d'une variable de type string en C#" me semble comme si la commande dépend d'une seule variable. – VVS

+0

hmm oui vous avez raison je pense, désolé. J'ai écrit mauvaise réponse alors :) –

0

Have C# Test le contenu de la liste, et ne l'ordre que si elle ne contient pas nulle.

var myList = (from s in dataContect.Users select s).ToList(); 

bool containsNull = false; 

foreach (var item in mylist) 
{ 
    if (string.IsNullOrEmpty(item.LastName)) 
    { 
     containsNull = true; 
    } 
} 

if (!containsNull) 
{ 
    // If is not contains null, Use Order By 
    myList = myList.OrderBy(k => k....); 
}