2017-01-11 6 views
3

J'ai une requête requête utilisant linq. La requête a une clause where multiple renvoyant la liste des éléments correspondant au nom et à la ville. Ci-dessous est le morceau de code que j'ai utilisé pour la clause where multiple, mais il renvoie un ensemble vide d'éléments. wherefield contient la liste des noms de champs comme le nom, la ville wherefieldValue contient la liste des valeurs de champ comme James, delhiClé dynamique multiple where dans linq C#

var where = FilterLinq<T>.GetWherePredicate(wherefield, wherefieldvalue).Compile(); 
items = items.Where(where).OrderByDescending(a => a.GetType().GetProperty(field).GetValue(a, null)).Skip 

public class FilterLinq<T> 
{ 
    public static Expression<Func<T, Boolean>> GetWherePredicate(string whereFieldList, string whereFieldValues) 
    { 
     //the 'IN' parameter for expression ie T=> condition 
     ParameterExpression pe = Expression.Parameter(typeof(T), typeof(T).Name); 

     //combine them with and 1=1 Like no expression 
     Expression combined = null; 
     if (whereFieldList != null) 
     { 
      string[] field = whereFieldList.Split(';'); 
      string[] fieldValue = whereFieldValues.Split(';'); 
      for (int i = 0; i < field.Count(); i++) 
      { 
       //Expression for accessing Fields name property 
       Expression columnNameProperty = Expression.Property(pe, field[i]); 

       //the name constant to match 
       Expression columnValue = Expression.Constant(fieldValue[i]); 

       //the first expression: PatientantLastName = ? 
       Expression e1 = Expression.Equal(columnNameProperty, columnValue); 

       if (combined == null) 
       { 
        combined = e1; 
       } 
       else 
       { 
        combined = Expression.And(combined, e1); 
       } 
      } 
     } 

     //create and return the predicate 
     return Expression.Lambda<Func<T, Boolean>>(combined, new ParameterExpression[] { pe }); 
    } 
} 
+3

Un peu plus de code que nécessaire à mon goût, mais aucun bogue évident dès que les champs sont 'string' type' (' Expression.And' devrait être 'Expression.AndAlso', mais cela ne devrait pas changer le résultat). Pouvez-vous poster un exemple qui reproduit le problème? –

+0

La deuxième ligne de votre code semble être incomplète. C'est peut-être une question stupide mais êtes-vous sûr que la clause where filtre tous les éléments? Y at-il une chance que, à la place, le problème est lié à l'instruction 'Skip' à la fin de la ligne? – wkl

+0

Merci à tous pour les détails. J'ai un whereField qui est int et un autre une chaîne. Je vais essayer de convertir int en chaîne avant et vérifier – user166013

Répondre

0

Votre exemple fonctionne. Bien sûr, cela ne fonctionne que pour les propriétés de chaîne, mais je suppose que c'est votre cas d'utilisation. Peut-être qu'il ne fait pas ce que vous voulez atteindre, becasue vous combinez votre article avec et, mais en fait vous ne voulez faire avec ou, jus modifier cette ligne de code:

combined = Expression.And(combined, e1); 

Pour

combined = Expression.Or(combined, e1); 
+2

Et et ou sont des opérateurs au niveau du bit. Utilisez AndAlso et OrElse !!! – MBoros