usar una tipo puede metodos funciones expresiones expresion español ejemplos delegado cómo convertir consulta anonimos anonimas c# linq lambda .net-4.5

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:

  1. no puede usar expresiones lambda para llamadas dinámicas como esta;
  2. 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?