当我尝试使用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做了任何错误?任何帮助表示赞赏。
答案 0 :(得分:3)
我认为问题正在发生,因为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())