我正在编写一个在ASP.NET Core上使用Entity Framework Core的网站。我有一个自定义IQueryable
实现来帮助处理可分页/可排序表。此自定义IQueryable
的一个功能是名为WithIndices
的方法,它为每个项目创建一个元组,将其与整个数据集中的索引(不仅仅是该页面上的索引)配对。
实施如下:
public IEnumerable<(int, TData)> WithIndices()
{
int i = this.StartIndex;
foreach (TData item in this.inner)
yield return (i++, item);
}
当TData
是我称为Forum
的标准模型之一时,我的数据丢失很少。 Forum
有一个属性
public Forum Parent { get; set; }
与
一起public int? ParentId { get; set; }
如果我以特定的方式对数据进行排序,它就可以了。但是如果我按相反顺序(升序与降序)对其进行排序,Parent
属性在foreach
期间以某种方式设置为空。
如果我在yield return
行上为行为不端的项目设置断点,我可以检查this.inner
并枚举调试器中的结果视图,使其评估查询并显示项目。 Parent
属性设置正确,ParentId
也是如此。但是,当我在调试器中检查item
时,Parent
为空(但ParentId
仍然设置正确)。
什么会导致此特定实例与调试器从评估this.inner
得到的实例不同?这是相同的可枚举。如果我在Watch窗口中调用this.inner.ToArray()
,它也会正确设置。只是在这个foreach
循环中,属性才会被取消。这是一个值得为Entity Framework记录的错误吗?