Ayer pregunté very similar question, pero no fue hasta hoy que me di cuenta de que la respuesta que acepté no resuelve todos mis problemas. Tengo el siguiente código:¿Cómo puedo crear una propiedad multi-propiedad dinámica en un IEnumerable <T> en tiempo de ejecución?
public Expression<Func<TItem, object>> SelectExpression<TItem>(string fieldName)
{
var param = Expression.Parameter(typeof(TItem), "item");
var field = Expression.Property(param, fieldName);
return Expression.Lambda<Func<TItem, object>>(field,
new ParameterExpression[] { param });
}
que se utiliza de la siguiente manera:
string primaryKey = _map.GetPrimaryKeys(typeof(TOriginator)).Single();
var primaryKeyExpression = SelectExpression<TOriginator>(primaryKey);
var primaryKeyResults = query.Select(primaryKeyExpression).ToList();
Esto me permite sacar las claves principales de una IQueryable<TUnknown>
. El problema es que este código solo funciona con una sola clave principal y necesito agregar soporte para múltiples PK.
Entonces, ¿hay alguna manera de adaptar el método SelectExpression
anterior para tomar un IEnumerable<string>
(que es mi lista de nombres de propiedades de claves principales) y hacer que el método devuelva una expresión que seleccione esas claves?
I.e. Teniendo en cuenta lo siguiente:
var knownRuntimePrimaryKeys = new string[] { "CustomerId", "OrderId" }`
Mi Selecto tiene que hacer lo siguiente (en tiempo de ejecución):
var primaryKeys = query.Select(x=> new { x.CustomerId, x.OrderId });
El problema es que los tipos anónimos que son los resultados de la selecta statemet se crean en tiempo de compilación .. – m0sa
¿Existe una alternativa a la utilización de un tipo anónimo y todavía lograr lo que necesito? ¿O está de vuelta al tablero de dibujo? – GenericTypeTea
@GenericTypeTea, ¿sería una Tuple una opción aceptable para usted? –