2011-04-12 2 views
4

J'ai cette requête LINQ:Entity Framework 4.0 avec Sql Compact Edition 4.0 - Non implémenté Exception

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); 

Lorsque vous utilisez SQL Server, tout fonctionne bien. Cependant, lors de l'utilisation SQLCE, je reçois l'erreur suivante:

[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 

Toute idée de ce qui se passe ici?

J'ai même essayé d'appeler ToArray() avant foreach, mais cela n'a pas aidé.

EDIT:

Si je change la requête:

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

Il fonctionne ... pourquoi?

EDIT 2: BTW les points de navigateur Parent à la même table, de sorte que chaque Node peut avoir {0..1} parent Node.

+0

Je recevais une erreur similaire dans mon code EF, mais je crois que c'était une exception de blocage sur la transaction. Je me demande si le ToArray avant OrderBy ne fait que forcer le traitement dans votre code C# plutôt que dans la base de données, réduisant ainsi le temps de traitement dans la base de données, réduisant ainsi la probabilité d'un blocage dans la base de données? –

+0

@deverop Avez-vous trouvé une solution à ce problème ou passez-vous à Microsoft? Je vois quelque chose de similaire sans Entity Framework mais il est plus difficile à reproduire. Avez-vous un exemple complet? – Travis

+0

@Travis Non, je n'ai pas trouvé la solution et je n'ai pas escaladé. J'ai fini par changer la requête et la décomposer en appelant 'ToArray()' avant de trier. –

Répondre

1

Le fait que la requête dans votre section Modifier fonctionne indique que le problème est dans la clause OrderBy(n => n.SortOrder), parce que cette partie de la requête ...

DataContext.Entities.Nodes 
        .Where(n => n.Parent.Name == node.Key) 

... est en fait exécuté sur le serveur . En appelant le .ToArray(), vous forcez l'exécution de la requête et le chargement d'une liste (non triée) en mémoire. Le OrderBy suivant définit une requête sur cette liste (qui est un IEnumerable et non plus un IQueryable). Cette deuxième requête sera alors exécutée dans la mémoire de cette liste et EF ou SqlCe n'est pas impliqué dans ce tri.

Mais généralement SqlCe prend en charge OrderBy, donc la question demeure pourquoi la première requête lève une exception.

Quel type est Node.SortOrder vous essayez de trier par? Est-il nullable par exemple ou un type "exotique" que SqlCe n'est pas capable de trier?

+0

'Node.SortOrder' est un' int'. Pourrais-je aussi ajouter que le changement de 'OrderBy' et' Where' ne fait pas de différence. Donc, 'DataContext.Entites.Nodes.OrderBy (n => n.SortOrder) .Where (n => n.Parent.Name == node.Key)' renvoie la même exception. –

+1

@deverop: Avez-vous aussi testé si elle lance une exception si vous * ne faites que trier * ('OrderBy' sans 'Where') ou si vous * filtrez seulement * (' Where' sans 'OrderBy')? Ce serait également intéressant d'affiner la question. – Slauma

+0

Merci pour la suggestion. 'OrderBy' fonctionne par lui-même, et la même chose s'applique à' Where' (comme démontré dans la question). Mais je ne peux pas les utiliser ensemble. –

Questions connexes