Entity framework 4 实体框架4.0和Sql Compact Edition 4.0-未实现异常

Entity framework 4 实体框架4.0和Sql Compact Edition 4.0-未实现异常,entity-framework-4,linq-to-entities,sql-server-ce-4,Entity Framework 4,Linq To Entities,Sql Server Ce 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);

我有一个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);
它是有效的。。。为什么?


edit2:BTW
父节点导航器指向同一个表,因此每个
节点可以有{0..1}父节点
节点
编辑部分中的查询工作的事实表明问题出在
OrderBy(n=>n.SortOrder)
子句中,因为只有这部分查询

DataContext.Entities.Nodes
                    .Where(n => n.Parent.Name == node.Key)
。。。实际上是在服务器上执行的。通过调用
.ToArray()
可以强制执行查询,并将(未排序的)列表加载到内存中。以下
OrderBy
定义了此列表上的查询(它是
IEnumerable
而不再是
IQueryable
)。然后,第二个查询将在此列表的内存中执行,EF或SqlCe不参与此排序

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


您尝试按什么类型进行排序?例如,它是可以为null的还是SqlCe无法按其排序的某个“外来”类型?

节点。SortOrder
是一个
int
。我还想补充一点,切换
OrderBy
Where
并没有什么区别。因此,
DataContext.Entites.Nodes.OrderBy(n=>n.SortOrder).Where(n=>n.Parent.Name==node.Key)
引发了相同的异常。@deverop:您是否也测试了如果您只进行排序(
OrderBy
而不进行
Where
)或者只进行筛选(
Where
而不进行
OrderBy
),它是否会引发异常?这也将是有趣的缩小问题。谢谢你的建议
OrderBy
本身起作用,这同样适用于
中的
(如问题中所示)。但我就是不能同时使用它们。@deverop:恐怕我已经没有主意了。您正在执行的查询看起来相当简单,我不明白为什么会失败。我建议您也直接向Microsoft询问这个问题,以提高您找到解决方案的机会—例如:我在EF代码中遇到了类似的错误,但我相信这是事务中的死锁异常。我想知道OrderBy之前的ToArray是否只是强制在您的C#代码中而不是在DB中进行更多的处理,从而减少了DB中的处理时间,从而降低了DB中出现死锁的可能性?@deverop您找到了解决方案还是升级到了Microsoft?我看到了一些类似的东西,没有实体框架,但很难复制。你有完整的例子吗?@Travis Nope我没有找到解决方案,也没有升级。在排序之前,我通过调用
ToArray()
来更改查询并将其分解。@adaptivebummer。复制场景是否像拥有一个具有父关系的表并执行上面的where/orderby查询那样简单?还是您的映射比这更复杂?@Travis表必须有一个对自身的循环引用。在我的例子中,节点可以有类型为
node
的父节点和子节点。