Estoy tratando de usar una consulta dinámica linq para recuperar un IEnumerable <T> de una colección de objetos (Linq a Object), cada uno de los objetos en la colección tiene una colección interna con otro conjunto de objetos donde se almacenan los datos, se accede a estos valores a través de un indexador de la colección externaDinámico Linq - Realiza una consulta sobre un objeto con miembros del tipo "dinámico"
La consulta dinámica linq devuelve el conjunto filtrado como se esperaba cuando se trabaja con objetos muy tipados pero mi objeto almacena los datos en un miembro del tipo dinámico, consulte el siguiente ejemplo:
public class Data
{
public Data(string name, dynamic value)
{
this.Name = name;
this.Value = value;
}
public string Name { get; set; }
public dynamic Value { get; set; }
}
public class DataItem : IEnumerable
{
private List<Data> _collection;
public DataItem()
{ _collection = new List<Data>(); }
public dynamic this[string name]
{
get
{
Data d;
if ((d = _collection.FirstOrDefault(i => i.Name == name)) == null)
return (null);
return (d.Value);
}
}
public void Add(Data data)
{ _collection.Add(data); }
public IEnumerator GetEnumerator()
{
return _collection.GetEnumerator();
}
}
public class Program
{
public void Example()
{
List<DataItem> repository = new List<DataItem>(){
new DataItem() {
new Data("Name", "Mike"),
new Data("Age", 25),
new Data("BirthDate", new DateTime(1987, 1, 5))
},
new DataItem() {
new Data("Name", "Steve"),
new Data("Age", 30),
new Data("BirthDate", new DateTime(1982, 1, 10))
}
};
IEnumerable<DataItem> result = repository.AsQueryable<DataItem>().Where("it[\"Age\"] == 30");
if (result.Count() == 1)
Console.WriteLine(result.Single()["Name"]);
}
Cuando ejecuto el ejemplo anterior me sale: '==' Operador incompatible con 'objeto' tipos de operando y 'Int32'
son dinámicas miembros incompatibles con las consultas LINQ dinámica ?, o hay otra forma de construir expresiones que evaluarían correctamente cuando se trata de miembros del tipo dinámico
Muchas gracias por su ayuda.
Entonces, ¿realmente no son 'compatibles'? –
Gracias, que las soluciones funcionan bien cuando sabemos de antemano el tipo de tiempo de ejecución del valor, pero qué ocurre cuando la consulta se crea programáticamente, realmente no sabremos cómo convertir los valores de antemano. ¿Hay alguna otra manera en que se pueda construir una expresión? – Darsegura
@ M.Babcock: Depende de su definición de 'compatible'. – afrischke