如果不首先将 lambda 表达式转换为委托或表达式树类型,则无法将 lambda 表达式用作动态分派操作的参数
Posted
技术标签:
【中文标题】如果不首先将 lambda 表达式转换为委托或表达式树类型,则无法将 lambda 表达式用作动态分派操作的参数【英文标题】:Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type 【发布时间】: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<List<object>>();
编译器允许第二条语句吗?
为什么编译器不允许 LINQ 选择,但允许每个`?
【问题讨论】:
topAgents
必须是dynamic
吗?如果您改用var
,它是否有效?
【参考方案1】:
问题在于topAgents
是dynamic
- 所以你的ToList()
调用是动态的,Select
也是动态的。这有以下问题:
-
您不能将 lambda 表达式用于这样的动态调用;
动态调用无论如何都找不到扩展方法。
幸运的是,操作不需要是动态的,因为 element 类型是动态的。你可以使用:
IEnumerable<dynamic> topAgents = ...;
...或者只使用var
。这两个都应该没问题。
【讨论】:
谢谢,我一直没看到topAgents
是dynamic
。以上是关于如果不首先将 lambda 表达式转换为委托或表达式树类型,则无法将 lambda 表达式用作动态分派操作的参数的主要内容,如果未能解决你的问题,请参考以下文章
无法将 lambda 表达式转换为“字符串”类型,因为它不是委托类型 [重复]
无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型
实体框架 - 无法将 lambda 表达式转换为类型“字符串”,因为它不是委托类型
错误:无法将 lambda 表达式转换为类型“bool”,因为它不是 Kendo Chart 中的委托类型