Sto usando dynamic-linq per filtrare un elenco di oggetti usando una semplice clausola 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");
Il codice sopra funziona, ma ora devo applicare la stessa logica su un elenco di dizionario:
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!
Immagino che ci debba essere un modo per dire a dynamic-linq come dovrebbero essere lanciati gli elementi della lista ma sto facendo fatica a scoprire come.
AGGIORNARE
Ho preso una classe Employee come esempio in modo che tutti potessero capire, ma il motivo per cui uso un dizionario è perché sarà riempito da un dataReader generato da una query sql dinamica. Anche la clausola where dovrebbe essere dinamica.
Basta non usare il linq dinamico, dato che in un dizionario sono già presenti le informazioni sul campo, che non utilizza ricerche statiche delle sue chiavi.
IQueryable<EmployeeDictionary> result2 = queryable2
.Where(dictionary => object.Equals(dictionary["Age"], 3));