我试图理解我在.net 3.5 sp1 MySQL 6.1.2.0上使用实体框架作为提供者的情况.它涉及以下代码:
Response.Write("Products: " + plist.Count() + "
");
var total = 0;
foreach (var p in plist)
{
//... some actions
total++;
//... other actions
}
Response.Write("Total Products Checked: " + total + "
");
基本上,每次运行的总产品是不同的,并且它与plist中的全部总数不匹配.它的差异很大,从大约1/5到一半.
foreach中没有任何控制流程代码,即没有中断,继续,尝试/捕获,总计条件,任何可能影响计数的条件.作为确认,在循环内捕获与动作相关的其他总计,并且这些总计匹配较低和较高的总运行.
除了实体框架或mysql提供程序中的某些东西导致它在检索项目时结束foreach时,我没有找到上述任何理由.
foreach的主体可以在时间上有一些很好的变化,因为动作涉及文件&网络访问,我当时最好的镜头是,当.net代码超过某个阈值时,底层框架/提供程序中存在某种类型的超时,而不是导致异常,它默默地报告没有更多的枚举项.
任何人都可以在上述场景中给出一些启示和/或确认实体框架/ mysql提供程序是否具有上述行为?
更新1:我不能通过在测试项目中的简单foreach中使用Thread.Sleep来重现行为,不知道在哪里寻找这种奇怪的行为:(.
更新2:在上面的示例中,.Count()始终返回相同的正确数量的项目.按建议使用ToList或ToArray可以按预期解决问题(foreach主体中没有流控制语句),并且两次计数匹配在每次运行时都不会发生变化.
我感兴趣的是在实体框架mysql中导致这种行为的原因.真的不想在枚举结果之前不必更改使用实体框架mysql的所有项目中的代码.ToArray因为我不知道什么时候会吞下一些结果.或者如果我这样做,至少知道它发生了什么/为什么发生.