无法首先将其转换为委托或expression式树types,不能将lambdaexpression式用作dynamic调度操作的参数

我正在使用.NET4.5和VS2013,我有这个查询从数据库获取dynamic结果。

 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>(); 

以下语句失败,编译错误Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type ,甚至不允许我运行它

 topAgents.ToList().Select(agent => new { User = agent.User != null ? string.Format("{0}", agent.User).Replace("CORPNTGB\\", "") : null, Amount = agent.Amount }); 

而这个与foreach工作就好了。

 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 }); } 

在我眼前我topAgents.ToList()他们可以被解释为等价的,是因为我明确指出, var data = new List<List<object>>(); 那第二个陈述是编译器允许的?

为什么不编译允许LINQselect,但允许每个“?

问题是topAgentsdynamic – 所以你的ToList()调用是dynamic的, Select 。 这有以下问题:

  1. 你不能像这样使用lambdaexpression式进行dynamic调用;
  2. dynamic调用无论如何都找不到扩展方法。

幸运的是,仅仅因为元素types是dynamic的,操作不需要是dynamic的。 你可以使用:

 IEnumerable<dynamic> topAgents = ...; 

…或者只是使用var 这两个都应该没问题。