C# 如果不首先将lambda表达式强制转换为委托或表达式树类型,则无法将其用作动态调度操作的参数

C# 如果不首先将lambda表达式强制转换为委托或表达式树类型,则无法将其用作动态调度操作的参数,c#,linq,lambda,.net-4.5,C#,Linq,Lambda,.net 4.5,我正在使用.NET4.5和VS2013,我有一个查询,它从数据库中获取动态结果 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") .

我正在使用.NET4.5和VS2013,我有一个查询,它从数据库中获取
动态
结果

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>();
而这个带有
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
    });
}
var data=newlist();
foreach(topAgents中的动态代理)
{
添加数据(新列表)
{
agent.User!=null?string.Format(“{0}”,agent.User).Replace(“CORPNTGB\\”,“”):null,
代理,金额
});
}
在我看来,在我
topAgents.ToList()
之后,它们可以被解释为等价的,是因为我明确声明
var data=new List()编译器是否允许第二条语句


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

问题是
topAgents
动态的
——因此您的
ToList()
调用是动态的,
select
也是动态的。有以下问题:

  • 不能对这样的动态调用使用lambda表达式
  • 动态调用无论如何都找不到扩展方法
  • 幸运的是,操作不需要是动态的,因为元素类型是动态的。您可以使用:

    IEnumerable<dynamic> topAgents = ...;
    
    IEnumerable TopAgent=。。。;
    

    。。。或者只使用
    var
    。这两个都可以。

    顶级代理是否必须是动态的?如果改用
    var
    是否有效?谢谢,我不知何故一直没有看到
    topAgents
    dynamic
    IEnumerable<dynamic> topAgents = ...;