J'ai une liste d'objets comme celui-ci (j'utilise .NET 3.5)
public class MyObjects
{
public object Name { get; set; }
public bool Case { get; set; }
}
List<MyObjects> test = new List<MyObjects> {
new MyObjects { Name = "one" },
new MyObjects { Name = "two" },
new MyObjects { Name = "three" },
new MyObjects { Name = "four" },
new MyObjects { Name = "one1" },
new MyObjects { Name = "two1" },
new MyObjects { Name = "three1" },
new MyObjects { Name = "four1" },
new MyObjects { Name = "one2" },
new MyObjects { Name = "two2" },
new MyObjects { Name = "three2" },
new MyObjects { Name = "four2" },
};
Maintenant, j'essaie de rechercher dans la liste en utilisant Linq. Cela fonctionne comme prévu
var tmp = test
.Select(p => p.Name)
.Where(x => x.ToString().Contains("One", StringComparison.InvariantCultureIgnoreCase))
;
En utilisant Dynamic Linq, cela fonctionne aussi comme prévu
var dtmp = test.AsQueryable()
.Select(p => p.Name)
.Where("ToString().Contains(@0)", "one")
;
Cependant, lorsque vous essayez d'utiliser la casse (in) sensible, la dynamique échoue.
var dtmp2 = test.AsQueryable()
.Select(p => p.Name)
.Where("ToString().Contains(@0, @1)", "one", StringComparison.InvariantCultureIgnoreCase)
;
L'erreur est
No applicable method 'Contains' exists in type 'String'
Ma première tentative a été d'écrire une extension Contains () comme celle-ci
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
return source.IndexOf(toCheck, comp) >= 0;
}
Apparaît que Dynamic Linq n'est pas au courant de mon extension. J'ai découvert (selon cela) https://social.msdn.microsoft.com/Forums/en-US/39763339-1700-486f-9800-badd257e921e/custom-extension-methods-and-dynamic-linq-dynamic-expression -api? forum = linqprojectgeneral
que Dynamic Linq ne peut pas utiliser l'extension (statique) très facilement.
Alors soit:
Transformez l'extension dans une méthode normale. Cependant, comment puis-je faire cela pour chaque ToString (), est-ce possible ou dois-je écrire une méthode dans MyObject puis utiliser linq avec des objets spécifiques?
Modifiez le code Dynamic Library pour accepter les extensions statiques codées en dur (mes).
D'autres suggestions?
Remarque: je pourrais utiliser un simple if / else pour la casse avec deux dynamiques mais je préfère résoudre la manière dynamique car mon application utilise un filtrage complexe.
Merci d'avance,
Si votre application a besoin de capacités de filtrage dynamique, je recommanderais à l'appelant de passer un prédicat.
Cela permet une séparation des préoccupations et un test unitaire plus facile.
En outre, pas besoin d'une instruction IF / ELSE lorsque l'appelant passe un prédicat.
var predicate = new Predicate<string>(str => str.Contains("one"));
var tmp = test.Select(p => p.Name).Where(predicate);