You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用LINQ SelectMany转换为Dictionary时遇表达式树错误

问题解决:表达式树lambda不允许包含字典初始化器

错误原因

你在SelectMany里尝试初始化字典,但EF的LINQ表达式树无法将字典初始化器转换为SQL语句,因此抛出An expression tree lambda may not contain a dictionary initializer错误。另外你的代码里SelectMany完全多余——你要构建的是“WorkpaperId为键、对应明细列表为值”的字典,不需要先拆成单个字典再合并。

修正代码

直接用ToDictionary方法,同时通过AsEnumerable()切换到内存执行后续操作(避开表达式树的语法限制):

var asd = uow.WorkpaperRepo.GetAllNoTracking(expression)
    .AsEnumerable() // 把数据加载到内存,用LINQ to Objects处理
    .ToDictionary(
        wps => wps.WorkpaperId,
        wps => wps.AccountMap.AccountMappings.Select(y => new WorkpaperClientDetail
        {
            AccountName = y.ClientAccount.Description,
            AccountNumber = y.ClientAccount.Code
        }).ToList()
    );

补充说明

  • 如果导航属性(AccountMap、AccountMappings、ClientAccount)没预先加载,记得在GetAllNoTracking后加上Include链式调用,避免N+1查询问题。
  • 若你的EF Core版本支持直接将ToDictionary的表达式转成SQL(且导航属性配置正确),可以尝试去掉AsEnumerable();如果仍报错,保留该方法即可——内存中的LINQ操作不受表达式树的语法限制。

内容的提问来源于stack exchange,提问作者Ronak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:15:30