I am working with .NET4.5 and VS2013, I have this query that gets dynamic
result from 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>();
Following statement fails with compilation error Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type
without even allowing me to run it
topAgents.ToList().Select(agent => new { User = agent.User != null ? string.Format("{0}", agent.User).Replace("CORPNTGB\\", "") : null, Amount = agent.Amount });
while this one with foreach
works just fine.
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 }); }
In my eyes after I topAgents.ToList()
they could be interpreted as equivalent, is it because I explicitly state that var data = new List<List<object>>();
that second statement is allowed by compiler?
Why doesn't compiler allow LINQ select, but allows for each`?
The problem is that topAgents
is dynamic
- so your ToList()
call is dynamic, and so is Select
. That has issues that:
Fortunately, the operations don't need to be dynamic just because the element type is dynamic. You could use:
IEnumerable<dynamic> topAgents = ...;
... or just use var
. Both of those should be fine.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With