使用Sql Compact Edition 4.0的Entity Framework 4.0 - 未实现异常。

4

我有这个LINQ查询:

    var children = DataContext.Entities.Nodes
                    .Where(n => n.Parent.Name == node.Key)
                    .OrderBy(n => n.SortOrder);

    foreach (var child in children)
        var childNode = CreateNode(child);

当使用SQL Server时,一切正常。但是,当使用SqlCe时,我会遇到以下错误:
[SqlCeException (0x80004005): Not implemented]
   System.Data.SqlServerCe.SqlCeDataReader.ProcessResults(Int32 hr) +125
   System.Data.SqlServerCe.SqlCeDataReader.IsEndOfRowset(Int32 hr) +131
   System.Data.SqlServerCe.SqlCeDataReader.Move(DIRECTION direction) +376
   System.Data.SqlServerCe.SqlCeDataReader.Read() +95
   System.Data.Common.Internal.Materialization.Shaper`1.StoreRead() +44

[EntityCommandExecutionException: An error occurred while reading from the store provider's data reader. See the inner exception for details.]
   System.Data.Common.Internal.Materialization.Shaper`1.StoreRead() +130
   System.Data.Common.Internal.Materialization.SimpleEnumerator.MoveNext() +46

这里发生了什么事情,有任何想法吗?

我甚至在foreach之前尝试调用ToArray(),但并没有帮助。

编辑:

如果我将查询更改为:

    var children = DataContext.Entities.Nodes
                    .Where(n => n.Parent.Name == node.Key)
                    .ToArray()
                    .OrderBy(n => n.SortOrder);

它能够运行...为什么?

编辑2: 顺便提一下,Parent 导航器指向同一个表格,所以每个 Node 可以有 {0..1} 个父 Node


我在我的EF代码中遇到了类似的错误,但我认为这是事务上的死锁异常。我想知道在OrderBy之前加上ToArray是否只是强制在你的C#代码中进行更多的处理而不是在数据库中进行,从而减少了数据库中的处理时间,从而降低了在数据库中发生死锁的概率? - Andrew Garrison
@deverop 你找到解决方案了还是升级到了微软?我也遇到了类似的问题,但没有使用实体框架,很难复现。你有完整的示例吗? - Travis
@Travis 没错,我没有找到解决方案,也没有升级。最终我改变了查询方式,并在排序之前调用 ToArray() 进行分割。 - Alfero Chingono
@adaptive 真遗憾。重复的情况是否只是一个带有父关系的表,并执行上述where/orderby查询?还是你的映射比那更复杂? - Travis
@Travis 这个表格必须对自身具有循环引用。在我的情况下,节点可以拥有一个Node类型的父级以及子级。 - Alfero Chingono
1个回答

1
你在编辑部分的查询能够正常工作,这表明问题出现在OrderBy(n => n.SortOrder)子句中,因为只有这部分查询...
DataContext.Entities.Nodes
                    .Where(n => n.Parent.Name == node.Key)

实际上,查询是在服务器上执行的。通过调用.ToArray(),您强制执行查询,并将(未排序的)列表加载到内存中。以下的OrderBy定义了对此列表的查询(它是一个IEnumerable而不是IQueryable)。然后,在这个列表上执行第二个查询,这个查询将在内存中执行,EF或SqlCe不参与此排序。

但一般来说,SqlCe支持OrderBy,所以问题仍然是为什么第一个查询会抛出异常。

Node.SortOrder的类型是什么?例如,它是否可为空或某些SqlCe无法排序的“奇特”类型?


Node.SortOrder 是一个 int。我也想补充一点,交换 OrderByWhere 不会有任何影响。因此,DataContext.Entites.Nodes.OrderBy(n => n.SortOrder).Where(n => n.Parent.Name == node.Key) 会抛出相同的异常。 - Alfero Chingono
1
@deverop:你是否也测试过仅进行排序(OrderBy而不是Where)或仅进行筛选(Where而不是OrderBy)时,它是否会抛出异常?这也很有趣,可以缩小问题范围。 - Slauma
谢谢建议。OrderBy本身可以工作,同样适用于Where(如问题中所示)。但我就是不能将它们结合使用。 - Alfero Chingono
@deverop:我很抱歉,我已经没有任何想法了。你正在执行的查询看起来相当简单,我无法看出为什么它会失败。我建议你直接向微软提出这个问题,以提高解决方案的机会 - 例如在这里:http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/threads/ - Slauma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接