J'ai utilisé dynamic-linq pour filtrer une liste d'objets à l'aide d'une simple clause Where:
public class Employee
{
public int Age = 0;
public string FirstName = "";
}
var list1 = new List<Employee>();
for (int i = 0; i < 100; i++)
{
list1.Add(new Employee()
{
Age = i,
FirstName = "FirstName-" + i
});
}
IQueryable<Employee> queryable1 = list1.AsQueryable();
IQueryable<Employee> result1 = queryable1.Where("Age==3");
Le code ci-dessus fonctionne mais maintenant je dois appliquer la même logique sur une liste de dictionnaire:
public class EmployeeDictionary : Dictionary<string, object>
{
}
var list2 = new List<EmployeeDictionary>();
for (int i = 0; i < 100; i++)
{
var employeeDictionary = new EmployeeDictionary();
employeeDictionary["Age"] = i;
employeeDictionary["FirstName"] = "FirstName-" + i;
list2.Add(employeeDictionary);
}
IQueryable<EmployeeDictionary> queryable2 = list2.AsQueryable();
IQueryable<EmployeeDictionary> result2 = queryable2.Where("Age==3"); //ParseException raised!
IQueryable<EmployeeDictionary> result2 = queryable2.Where("Value.Age==3"); //ParseException raised!
Je suppose qu'il doit y avoir un moyen de dire à dynamic-linq comment les éléments de la liste doivent être castés, mais j'ai du mal à trouver comment.
MISE À JOUR
J'ai pris une classe Employee comme exemple pour que tout le monde puisse comprendre, mais la raison pour laquelle j'utilise un dictionnaire est qu'il sera rempli à partir d'un dataReader généré à partir d'une requête SQL dynamique. La clause where doit également être dynamique.
N'utilisez pas du tout linq dynamique, car vous avez déjà les informations de champ dans un dictionnaire, qui n'utilise pas de recherches statiques de ses clés.
IQueryable<EmployeeDictionary> result2 = queryable2
.Where(dictionary => object.Equals(dictionary["Age"], 3));