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

知道这里发生了什么吗?

ToArray()我什至尝试过打电话foreach,但这并没有帮助。

编辑:

如果我将查询更改为:

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

它有效......为什么?

编辑2:顺便说一句,Parent导航器指向同一张表,所以每个人都Node可以有 {0..1} parent Node

4

1 回答 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 无法排序的某些“异国情调”类型?

于 2011-04-13T14:36:46.373 回答