Entity Framework 4.0 с Sql Compact Edition 4.0 - исключение не реализовано - PullRequest
4 голосов
/ 13 апреля 2011

У меня есть этот запрос 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, но этого не произошлоhelp.

РЕДАКТИРОВАТЬ:

Если я изменю запрос на:

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

Это работает ... почему?

РЕДАКТИРОВАТЬ 2: Кстати, навигатор Parent указывает на одну и ту же таблицу, поэтому у каждого Node может быть {0..1} родительский элемент Node.

1 Ответ

1 голос
/ 13 апреля 2011

Тот факт, что запрос в разделе «Правка» работает, указывает на то, что проблема в предложении 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 не может сортировать?

...