gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:33:04 25 4
gpt4 key购买 nike

我有一个类层次结构,我通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com