2009-11-04 2 views
1

Nous essayons de sérialiser certaines données, et l'un des éléments d'une collection est une "instruction linq d'exécution différée" (en fait, elle est le résultat d'un appel Concat sur une collection).Persistance des expressions linq d'exécution différée

Le problème est de savoir comment conserver cet objet. Il ne supporte pas ISerializable. Le type réel est quelque chose dans le style de System.Linq.Enumerable.WhereSelectListIterator <>

Je me demandais simplement si quelqu'un avait déjà rencontré ce problème et quelle était la solution.

+2

Vous ne pouvez pas exécuter la requête ('ToList',' ToArray') et sérialiser le résultat? –

Répondre

2

Vous pouvez appeler ToList() sur l'instruction Linq; cela rassemblera tous les résultats et les renverra dans un List<T> que vous pourrez ensuite sérialiser.

+0

Merci pour la réponse. Oui, c'est certainement une option. Le problème est que la classe en question est modélisée, et l'expression est ce qui est fourni comme un argument modélisé (ce qui pourrait être n'importe quoi). Donc, il ne semble pas que nous puissions appeler ToList() à ce sujet. Nous devons l'appeler sur la classe qui fournit la liste, ce qui n'est pas la solution la plus optimale. Mais c'est le meilleur que nous ayons trouvé jusqu'ici. –

1

Si l'interrogation des résultats et leur sérialisation ne sont pas une option, vous devrez manuellement sérialiser la requête d'une manière ou d'une autre.

Un problème est qu'il existe trop de types d'objet requête LINQ différents. Et tous ces types sont internes au cadre. Cela vous bloque à peu près.

Il y a peut-être une solution pour votre cas spécifique. Si le seul type de requête à sérialiser est le résultat d'un appel Concat, la solution n'est peut-être pas trop complexe. Tout dépend des collections que vous concaténéz et de la manière dont vous les souhaitez (ou souhaitez) les sérialiser.

+1

Si la requête était construite sur IQueryable au lieu de IEnumerable, ce serait plus simple. –

+0

@Martinho: +1 En effet! sérialisation des expressions lambda est plus facile que la sérialisation d'un délégué compilé – jpbochi

+0

Merci pour la réponse. Malheureusement, l'élément persistant est un argument basé sur un modèle, donc cela pourrait être n'importe quoi. La solution la plus simple que nous ayons à faire est d'aller à la classe fournissant cet argument, et d'appeler simplement ToList() (que nous pouvons sérialiser très bien). Nous pourrions potentiellement énumérer l'expression et persister chaque élément, mais nous aurions un problème du côté de la charge pour déterminer le type d'objet à instancier. –

Questions connexes