EntityFramework.dll 中发生了类型为“System.StackOverflowException”的未

本文关键字:System StackOverflowException 的未 dll 发生了 类型 EntityFramework | 更新日期: 2023-09-27 17:56:57

当我尝试使用 linq 查询大型数据时,我收到异常(在 EntityFramework.dll 中发生了类型为"System.StackOverflowException"的未处理异常)。引发错误的代码是,

    if (codeList != null && codeList.Count > 0)
        {
            List<string> codes = codeList.Select(x => x.DeptCode).Distinct().ToList();
            nameList = db.LegacyCodeDetails.Where(x => x.LegacyIdentifier.Contains(identifier) &&
                                                           x.ColumnAbr != null && x.ColumnAbr.Equals("NAME") &&
                                                           (codes.Where(y => x.LegacyIdentifier.Contains(y)).Count() > 0)
                                                    )
                                               .Select(x => new NameAndValue { Name = x.Value, Value = x.LegacyIdentifier }).Distinct().ToList();
            List<string> namesToDisplay = nameList.Select(x => x.Name).Distinct().ToList();

当有数百条记录时,相同的代码可以正常工作。我想知道可能是什么问题。

内部异常:无法计算表达式,因为当前线程处于堆栈溢出状态

环境:

Visual Studio 2012, Entity Framework 6.0, C#, SQL Server 2008 R2.

问题:

我对导致此异常的 linq 做错了什么吗?任何帮助,不胜感激。

EntityFramework.dll 中发生了类型为“System.StackOverflowException”的未

我相信发生

这个问题是因为codes太大了,并且您将IQueryable(db.LegacyCodeDetails.Where)与IEnumerable(codes)混合在一起,因此生成的SQL将包含codes中每个项目的一行。

如果codes来自另一个表,则可以在查询中直接访问该表。例如:

取代:

codes.Where(y => x.LegacyIdentifier.Contains(y)).Count() > 0)

跟:

db.Codes.Select(y => y.DeptCode).
        .Where(y => x.LegacyIdentifier.Contains(y)).Any())