无法首先将其转换为委托或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,但允许每个“?

One Solution collect form web for “无法首先将其转换为委托或expression式树types,不能将lambdaexpression式用作dynamic调度操作的参数”

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

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

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

 IEnumerable<dynamic> topAgents = ...; 

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

  • 什么是SQL Server Profiler中的“审计注销”?
  • 如何编写一个导致字典的LINQ查询?
  • 检查一个IEnumerable是否包含另一个IEnumerable的所有元素
  • EF 6.x DbContext生成器的用途
  • OrderBy在Lambdaexpression式中下降?
  • C#List <> GroupBy 2的值
  • 如何使用LINQ来select具有最小或最大属性值的对象
  • Find()和First()抛出exception,如何返回null?
  • 在EF 4.0中将string转换为Int
  • 什么函数作为.SelectMany()在jQuery?
  • 什么时候应该处理数据上下文