¿Cómo instanciar e inicializar un objeto dinámico en el árbol de expresiones?

.net c# dynamic expression-trees iqueryable

Pregunta

Cuando trabajamos con IQuerayble<TItem> podemos llamar a Select esta forma:

query.Select( item => new { A=item.Prop1, B=item.Prop2});

Y el método Select espera la Expression<Func<TItem,TResult>>

Necesito usar ExpandoObject lugar de una clase anónima pero estática.

Si fuera posible se vería así:

query.Select( item => dynamic new ExpandoBoject { A=item.Prop1, B=item.Prop2});

Así que quiero construir el árbol de Expression<Func<TItem,ExpandoObject>> donde las propiedades de los objetos se inicializan de manera similar a la del tipo anónimo.
La funcionalidad dinámica solo es necesaria para la inicialización, por lo que está bien que Func devuelva ExpandoObject lugar de dynamic .

No puedo encontrar mucha documentación sobre Expression.Dynamic y las carpetas correspondientes que debería usar.


Actualización 1

¿Por qué necesito todas estas cosas?
Porque quiero conseguir las llaves primarias .
Quiero hacerlo para cualquier tipo de entidad.

Sé cómo obtener la lista de propiedades que componen PK, pero ahora necesito hacer una difícil proyección de la entidad a EntityKey . Bueno, puede ser al mismo nivel de esta clase.

var keys = context.Set<TEntity>().Where(Expression<Func<TEntity,bool>).Select(Expression<Func<TEntity,EntityKey>>);

Como señalé en los comentarios, los bloques que contienen lambdas no se pueden convertir en árboles de expresión, por lo que no puedo simplemente crear el diccionario y llenarlo. Ahora estoy jugando con el árbol de expresiones semánticamente cerca de este código:

var dict = new Dictionary<string,object>();
dict.Add("Prop1",value1);
dict.Add("Prop2",value2);
return dict

Pero dudo que EF pueda analizar la expresión que contiene bloques. Necesito comprobar.
Y tengo curiosidad por saber si funcionará con objetos dinámicos y Expression.MemberInit, ya que funciona con objetos estáticos.


Actualización 2

Entity Framework no admite la sintaxis de inicialización del diccionario.
NotSupportedException la NotSupportedException con el mensaje: solo se NotSupportedException los elementos de inicialización de lista con un solo elemento en LINQ to Entities.


Actualización 3

EF no admite expresiones de bloque también.
NotSupportedException con mensaje: expresión LINQ desconocida de tipo 'Bloque'.

Respuesta popular

Ahora estoy jugando con el árbol de expresiones semánticamente cerca de este código:

var dict = new Dictionary<string,object>();
dict.Add("Prop1",value1);
dict.Add("Prop2",value2);
return dict;

Usted puede hacer eso, porque se puede escribir ese código como una sola expresión como esta:

new Dictionary<string, object>
{
    { "Prop1", value1 },
    { "Prop2", value2 }
};

Y puede crear un árbol de expresiones que contenga esta expresión (que EF debería poder manejar) de la siguiente manera:

var addMethod = typeof(Dictionary<string, object>).GetMethod("Add");

var expression = Expression.Lambda<Func<Dictionary<string, object>>>(
    Expression.ListInit(
        Expression.New(typeof(Dictionary<string, object>)),
        Expression.ElementInit(
            addMethod,
            Expression.Constant("Prop1"),
            value1Expression),
        Expression.ElementInit(
            addMethod,
            Expression.Constant("Prop2"),
            value2Expression)),
    itemParameterExpression);


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow