c# - metodos - No se puede usar una expresión lambda como argumento para una operación distribuida dinámicamente sin primero convertirla a un delegado o tipo de árbol de expresión
metodos anonimos c# (1)
El problema es que
topAgents
es
dynamic
, por lo que su llamada a
ToList()
es dinámica, al igual que
Select
.
Eso tiene problemas que:
- no puede usar expresiones lambda para llamadas dinámicas como esta;
- Las llamadas dinámicas no encuentran métodos de extensión de todos modos.
Afortunadamente, las operaciones no necesitan ser dinámicas solo porque el tipo de elemento es dinámico. Podrías usar:
IEnumerable<dynamic> topAgents = ...;
... o simplemente usa la
var
.
Ambos deberían estar bien.
Estoy trabajando con .NET4.5 y VS2013, tengo esta consulta que obtiene
dynamic
resultado
dynamic
de db.
dynamic topAgents = this._dataContext.Sql(
"select t.create_user_id as /"User/", sum(t.netamount) as /"Amount/" from transactiondetail t where t.update_date > sysdate -7 group by t.create_user_id")
.QueryMany<dynamic>();
La siguiente declaración falla con un error de compilación.
Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type
sin siquiera permitirme ejecutarla.
topAgents.ToList().Select(agent => new
{
User = agent.User != null ? string.Format("{0}", agent.User).Replace("CORPNTGB//", "") : null,
Amount = agent.Amount
});
mientras que este con
foreach
funciona bien.
var data = new List<List<object>>();
foreach (dynamic agent in topAgents)
{
data.Add(new List<object>
{
agent.User != null ? string.Format("{0}", agent.User).Replace("CORPNTGB//", "") : null,
agent.Amount
});
}
En mi opinión, después de
topAgents.ToList()
podrían interpretarse como equivalentes, ¿es porque
topAgents.ToList()
explícitamente que
var data = new List<List<object>>();
Qué segunda declaración es permitida por el compilador?
¿Por qué el compilador no permite la selección de LINQ, sino que permite cada uno?