IEnumerable <T>以某种方式转换为EntitySet <T>

for*_*atc 3 c# asp.net linq-to-sql asp.net-mvc-4

我有一个类的层次结构,我通过LINQ到SQL控制器从数据库中获取,并根据需要显示大类.让我解释一下:

BigProduct
IEnumerable<Review>
//...some generic types


Review
IEnumerable<Comment>
//...some generic types


Comment
//...some generic types
Run Code Online (Sandbox Code Playgroud)

因此,在我的控制器中,我获取大型产品并将其传递给主视图,然后将foreach中的评论传递给部分视图,并且在每个部分视图中,我有另一个foreach,应该将所有注释列为部分视图.

这些类型在类中明确定义为Ienumerable,这个dll在Web表单中运行良好,现在当我将鼠标悬停在razor的foreach循环中的Comment时,它表示它是EntitySet而不是IEnumerable,我得到"null异常:处理后的acessed context"这就是我将它作为IEnumerable传递给我的原因,因为我在一个地方获取所有内容.这种行为可能是什么原因?我没有改变这个曾经与webforms一起工作的dll中的任何东西.

更新:正如我所提到的,它与WebForms一起运行良好,我在调用时会调用.ToList()从IQueryable中获取IEnumerable!

Jon*_*eet 9

仅仅因为你声明IEnumerable<T>,它不会改变执行时类型.所以当你把它传递给你的视图时,视图会在编译时知道它是什么,IEnumerable<T>但是当你在调试时将鼠标悬停在它上面时,你会看到实际的类型.(目前尚不清楚你Comment在剃须刀视图中徘徊在什么位置,但我强烈怀疑它正处于调试会话的中间.)

如果你想获取数据的副本以便你可以处理上下文,只需调用ToList()并返回结果 - 这将是一个List<T>替代.

请注意,此编译时/执行时间差异与LINQ或MVC无关.你可以非常轻松地看到同样的东西而不会有任何复杂

object value = "hello";
Run Code Online (Sandbox Code Playgroud)

编译时的类型valueobject,它会阻止你调用Substring它等等.但是如果你将鼠标悬停value在调试会话中(或者在Watch或Local窗口中查看它),你会发现执行时类型仍然存在string.

编辑:从您的编辑:

我在选择数据时调用.ToList()从IQueryable获取IEnumerable!

我真的很想看到那些代码,因为我不相信你只是使用类似的东西:

return query.ToList();
Run Code Online (Sandbox Code Playgroud)

如果你要回复调用的结果ToList(),那将不会EntitySet.