Ho una tabella che è mappata, ma dopo la compilazione possono essere aggiunte o rimosse colonne aggiuntive dalla tabella. Sto cercando di creare una query linq che tenga conto di quelle nuove colonne. In questo scenario, voglio ordinare da una di quelle colonne dinamiche. Questo è quello che ho finora.
var queryableData = dc.wf_task_ext_attributes.AsQueryable();
ParameterExpression pe = Expression.Parameter(typeof(DateTime), "ExtValue105");
// The next line is where it fails
MethodCallExpression orderByCallExpression = Expression.Call(
typeof(Queryable),
"OrderBy",
new Type[] { queryableData.ElementType, queryableData.ElementType },
queryableData.Expression,
Expression.Lambda<Func<DateTime, DateTime>>(pe, new ParameterExpression[] { pe }));
IQueryable<string> results = queryableData.Provider.CreateQuery<string>
(orderByCallExpression);
Sta fallendo con il seguente messaggio:
Nessun metodo generico 'OrderBy' sul tipo 'System.Linq.Queryable' è compatibile con gli argomenti e gli argomenti del tipo fornito. Non è necessario fornire argomenti di tipo se il metodo non è generico.
Che cosa sto facendo di sbagliato?
Il tuo codice prova a creare qualcosa come Queryable.OrderBy(queryableData.Expression, ExtValue105 => ExtValue105)
. Non ho idea del perché ti aspetti che funzioni.
Se comprendo correttamente la tua domanda, devi creare dinamicamente un'espressione come attribute => attribute.ExtValue105
e quindi puoi usarla per chiamare OrderBy()
.
Il codice potrebbe avere un aspetto simile a questo (supponendo che queryableData
sia IQueryable<Attribute>
):
var parameter = Expression.Parameter(typeof(Attribute), "attribute");
var property = Expression.Property(parameter, "ExtValue105");
var lambda = Expression.Lambda(property, parameter);
IQueryable<Attribute> results =
Queryable.OrderBy(queryableData, (dynamic)lambda);
È possibile utilizzare queryableData.Provider.CreateQuery()
manualmente per evitare la chiamata dynamic
, ma sarebbe più complicato.