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

标签 c# asp.net linq-to-sql asp.net-mvc-4

我有一个类层次结构,我通过 LINQ to SQL Controller 从数据库中获取这些类,并根据需要显示那个大类。让我解释一下:

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


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


Comment
//...some generic types

所以在我的 Controller 中,我获取大产品并将其传递给主视图,然后将 foreach 中的评论传递给局部 View ,在每个局部 View 中,我都有另一个 foreach 应该将所有评论列为局部 View 。

类型在类中明确定义为 Ienumerable 并且此 dll 与 Web 表单一起工作正常,现在当我将鼠标悬停在 Razor 中 foreach 循环中的 Comment 上时,它说它是 EntitySet 而不是 IEnumerable 并且我得到“null exception:acessed context处置后”,这就是我首先将其作为 IEnumerable 传递的原因,因为我将所有内容都放在一个地方。这种行为的原因可能是什么?我没有更改此 dll 中的任何内容,该 dll 过去可以很好地与 webforms 一起使用。

更新:正如我提到的,它在 WebForms 上运行良好,我在选择数据时调用 .ToList() 从 IQueryable 获取 IEnumerable!

最佳答案

只是因为您声明它为IEnumerable<T> ,这不会更改执行时间 类型。因此,当您将它传递给您的 View 时,该 View 会在编译时知道它是IEnumerable<T>。但是当你在调试时将鼠标悬停在它上面时,你会看到实际的类型。 (不清楚您在 razor View 中什么时候将鼠标悬停在 Comment 上,但我强烈怀疑它正在调试 session 中。)

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

请注意,此编译时/执行时差异实际上与 LINQ 或 MVC 无关。你可以非常容易地看到同样的东西,没有任何复杂的东西:

object value = "hello";

value编译时 类型是object ,这将阻止您调用 Substring等等。但是如果你将鼠标悬停在 value 上在调试 session 中(或在 Watch 或 Local 窗口中查看)您会看到执行时类型仍然是 string .

编辑:来自您的编辑:

I am calling .ToList() to get IEnumerable from IQueryable in when selecting data!

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

return query.ToList();

如果您要返回调用 ToList() 的结果,那不会EntitySet .

关于c# - IEnumerable<T> 以某种方式转换为 EntitySet<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9912847/

相关文章:

javascript - 使用 window.open() 的多个窗口

c# - Linq-to-sql删除带有FK约束的记录

c# - 查找未一起查看的两个元素的组合(LINQ、SQL 或 C#)

c# - 如何监控特定应用程序的网络带宽使用情况?

c# - Azure 移动服务客户端 - 在多个 InsertAsync 任务上使用 WaitAll

c# - 从 delphi 到 C# Image1.Canvas.Pixels

c# - 授予 WPF 应用程序访问本地驱动器的权限?

javascript - 在asp.net Listview中添加自动计算求和行和列

linq-to-sql - Linq2Sql 查询 - 通过分组透视数据

asp.net - 比较2个linq应用程序: Unexpected result