如果不首先将lambda表达式转换为委托或表达式树类型,则不能将lambda表达式用作动态分派的操作的参数

Mat*_*ius 62 c# linq lambda .net-4.5

我正在使用.NET4.5和VS2013,我有这个查询dynamic从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>();
Run Code Online (Sandbox Code Playgroud)

以下语句失败并出现编译错误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
});
Run Code Online (Sandbox Code Playgroud)

虽然这个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
    });
}
Run Code Online (Sandbox Code Playgroud)

在我之后,我topAgents.ToList()可以将它们解释为等价,是因为我明确var data = new List<List<object>>();声明编译器允许第二个语句吗?

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

Jon*_*eet 86

问题是,topAgentsdynamic-让你的ToList()电话是动态的,所以是Select.这有以下问题:

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

幸运的是,操作不需要是动态的,因为元素类型是动态的.你可以使用:

IEnumerable<dynamic> topAgents = ...;
Run Code Online (Sandbox Code Playgroud)

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