我有这个 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
知道这里发生了什么吗?
我什至尝试在
ToArray()
之前调用 foreach
,但这没有帮助。编辑:
如果我将查询更改为:
var children = DataContext.Entities.Nodes
.Where(n => n.Parent.Name == node.Key)
.ToArray()
.OrderBy(n => n.SortOrder);
它有效......为什么?
编辑 2: 顺便说一句,
Parent
导航器指向同一个表,所以每个 Node
可以有 {0..1} 父 Node
。 最佳答案
您编辑部分中的查询有效的事实表明问题出在 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 无法排序的“异国情调”类型?关于entity-framework-4 - 带有 Sql Compact Edition 4.0 的 Entity Framework 4.0 - 未实现异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5641771/