【问题标题】:Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type如果不首先将 lambda 表达式转换为委托或表达式树类型,则无法将 lambda 表达式用作动态分派操作的参数
【发布时间】:2015-01-25 23:36:05
【问题描述】:

我正在使用 .NET4.5 和 VS2013,我有这个从 db 获取 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&lt;List&lt;object&gt;&gt;(); 编译器允许第二条语句吗?

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

【问题讨论】:

  • topAgents 必须是dynamic 吗?如果您改用var,它是否有效?

标签: c# linq lambda .net-4.5


【解决方案1】:

问题在于topAgentsdynamic - 所以你的ToList() 调用是动态的,Select 也是动态的。这有以下问题:

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

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

IEnumerable<dynamic> topAgents = ...;

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

【讨论】:

  • 谢谢,我一直没看到topAgents dynamic
猜你喜欢
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多