C# EntityFramework.dll中发生类型为“System.StackOverflowException”的未处理异常

C# EntityFramework.dll中发生类型为“System.StackOverflowException”的未处理异常,c#,linq,entity-framework,C#,Linq,Entity Framework,当我尝试使用linq查询大数据时,EntityFramework.dll中发生了类型为“System.StackOverflowException”的未处理异常。引发错误的代码是 if (codeList != null && codeList.Count > 0) { List<string> codes = codeList.Select(x => x.DeptCode).Distinct().ToLis

当我尝试使用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,实体框架6.0,C,SQL Server 2008 R2

问题:


导致此异常的linq是否有问题?非常感谢您的帮助。

我认为出现此问题的原因是代码太大,并且您将IQueryable db.LegacyCodeDetails.Where与IEnumerable代码混合,因此生成的SQL将包含代码中每个项目的一行

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

替换:

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


我认为出现此问题是因为代码太大,并且您将IQueryable db.LegacyCodeDetails.Where与IEnumerable代码混合,因此生成的SQL将包含代码中每个项目的一行

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

替换:

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


我认为出现此问题是因为代码太大,并且您将IQueryable db.LegacyCodeDetails.Where与IEnumerable代码混合,因此生成的SQL将包含代码中每个项目的一行

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

替换:

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


我认为出现此问题是因为代码太大,并且您将IQueryable db.LegacyCodeDetails.Where与IEnumerable代码混合,因此生成的SQL将包含代码中每个项目的一行

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

替换:

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


它在哪一行抛出异常?在上面的例子中,有很多ToList可能会发生。Stackoverflow-是的,您正在将大量数据放入内存。没有托利斯,你能做到吗。ToList将整个数据带到内存中,并在内存中执行linq to object过滤…但是如果您只有一个查询,并且只执行一次to列表。这可能会有所改善it@DanHunex,谢谢你的建议。我现在就试试。它在哪一行抛出异常?在上面的例子中,有很多ToList可能会发生。Stackoverflow-是的,您正在将大量数据放入内存。没有托利斯,你能做到吗。ToList将整个数据带到内存中,并在内存中执行linq to object过滤…但是如果您只有一个查询,并且只执行一次to列表。这可能会有所改善it@DanHunex,谢谢你的建议。我现在就试试。它在哪一行抛出异常?在上面的例子中,有很多ToList可能会发生。Stackoverflow-是的,您正在将大量数据放入内存。没有托利斯,你能做到吗。ToList将整个数据带到内存中,并在内存中执行linq to object过滤…但是如果您只有一个查询,并且只执行一次to列表。这可能会有所改善it@DanHunex,谢谢你的建议。我现在就试试。它在哪一行抛出异常?在上面的例子中,有很多ToList可能会发生。Stackoverflow-是的,您正在将大量数据放入内存。没有托利斯,你能做到吗。ToList将整个数据带到内存中,并在内存中执行linq to object过滤…但是如果您只有一个查询,并且只执行一次to列表。这可能会有所改善it@DanHunex,谢谢你的建议。我现在就试试。