在未先将其转换为委托或表达式树类型的情况下,无法将lambda表达式用作动态调度的操作的参数


78

我正在使用.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>>();编译器允许第二条语句?

为什么编译器不允许LINQ选择,但允许每个选择?


2
是否topAgents必须dynamic?如果您使用它,是否有效var
DavidG 2014年

Answers:


104

问题是,topAgentsdynamic-让你的ToList()电话是动态的,所以是Select。存在以下问题:

  1. 您不能将lambda表达式用于这样的动态调用;
  2. 无论如何,动态调用都找不到扩展方法。

幸运的是,这些操作不必只是因为元素类型是动态的就可以动态化。您可以使用:

IEnumerable<dynamic> topAgents = ...;

...或只是使用var。两者都应该很好。


谢谢,我不知何故topAgents 一直dynamic都在等待。
Matas Vaitkevicius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.