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ません)。この 2 番目のクエリは、このリストのメモリ内で実行され、EF または SqlCe はこの並べ替えに関与しません。

しかし、一般的に SqlCe は をサポートしてOrderByいるため、最初のクエリでなぜ例外がスローされるのかという疑問が残ります。

どのタイプでNode.SortOrder並べ替えようとしていますか? たとえば、SqlCeがソートできない「エキゾチックな」タイプはnull可能ですか?

于 2011-04-13T14:36:46.373 に答える