Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

C#LinqLambda.Net 4.5

C# Problem Overview


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`?

C# Solutions


Solution 1 - C#

The problem is that topAgents is dynamic - so your ToList() call is dynamic, and so is Select. That has issues that:

  1. you can't use lambda expressions for dynamic calls like this;
  2. dynamic calls don't find extension methods anyway.

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMatas VaitkeviciusView Question on Stackoverflow
Solution 1 - C#Jon SkeetView Answer on Stackoverflow