使用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
相关产品推荐
相关产品推荐

