MVC:删除列表而不执行任何代码

时间:2011-12-13 09:47:58

标签: c# asp.net-mvc

好吧,伙计们,这个问题让我感到困惑。我希望有人可以向我解释发生了什么,因为我觉得我正在失去理智... :)

情况如下: 在我的Index方法(MVC2应用程序)中,我查询数据库中表的全部内容,并将其插入到'temp'变量中。然后,我根据传递给我的方法的参数缩小列表范围。

if (int.TryParse(costcenter, out tempint) && !string.IsNullOrWhiteSpace(costcenter))
     {
            Trace.Write("From " + temp.Count());
            temp = temp.Where(x => x.tbl_CostCenters.Id == tempint);
            Trace.WriteLine(" to " + temp.Count());
     }

if (int.TryParse(supplier, out tempint) && !string.IsNullOrWhiteSpace(supplier))
            {
                temp = temp.Where(x => x.tbl_EquipmentType.tbl_Suppliers.id == tempint);
            }

            Trace.WriteLine(" to " + temp.Count());

这些参数作为字符串传递,因此我将它们转换为整数,然后使用查询根据值(如果有)进行过滤。我注意到的是,当我选择要过滤的CostCenter时(没有别的,所有其他变量都为空),没有返回结果。我添加了一些跟踪来检查应该显示多少项。鉴于其中有3个Trace.Write命令,我希望我的输出如下:

From 8989 to 65
 to 65

然而,我得到的是:

From 8989 to 65
 to 0

这意味着“供应商”过滤器出现问题。我调试它并逐步完成,程序执行以下操作:

  • 写完“至65”字符串后,程序跳转到“if(... supplier ...)”
  • 调试观察: tempint = 0,供应商 = null
  • 当评估为假时,程序直接跳到下一个Trace.Writeline
  • 突然,我的临时变量不包含任何元素。

我对此感到困惑,因为我的方法没有执行任何与temp变量相关的命令,但是它被清空了。 此外,当我评论“供应商”-filter(整个IF块)时,代码工作。错误发生在“供应商” - 过滤器中。

任何人都知道为什么会这样?提前谢谢!

更新

如果我只注释掉“供应商”-if-block的内容,并保留if-block本身,那也是不对的。所以问题出现在if语句的评估中。我在这里失去理智吗? :(

进一步更新

好吧,我通过在每个语句中添加.ToList()来修复它,以便temp现在是IEnumerable而不是IQueryable。

我仍然对为什么会发生这种情况感到困惑。任何人都可以解释为什么在没有将temp转换为List的情况下它不起作用?

1 个答案:

答案 0 :(得分:0)

发现你需要做一个.ToList(),否则你的查询会继续按引用而不是按值运行。

始终执行.ToList():)