32 votes

Exception étrange de LINQ To Entities

J'utilise une instruction LINQ qui sélectionne dans diverses tables des informations dont j'ai besoin pour remplir des enregistrements de type Post / Post Comment. J'obtiens une drôle d'exception disant que l'objet doit implémenter IConvertible lorsque j'essaie d'itérer l'ensemble des enregistrements. Ce qui est amusant, c'est que cela ne semble se produire que lorsque le type anonyme que j'utilise pour contenir les données contient plus de 2 collections génériques.

//select friend timeline posts posts
var pquery = from friend in fquery
    join post in db.game_timeline on friend.id equals post.user_id
    //join user in db.users on post.friend_id equals user.id into userGroup
    //join game in db.games on post.game_id equals game.game_id into gameGroup
    select new
    {
        Friend = friend,
        Post = post,

        Game = from game in db.games
          where game.game_id == post.game_id
          select game,

        Recipient = from user in db.users
          where user.id == post.user_id
          select user,

        Comments = from comment in db.timeline_comments
          where comment.post_id == post.id
          join users in db.users on comment.user_id equals users.id
          select new { User = users, Comment = comment }
    };

(Note : J'utilise MYSQL Connector/Net donc des choses comme Take et FirstOrDefault et des choses comme ça ne sont pas supportées dans les déclarations LINQ elles-mêmes, j'ai choisi d'utiliser ces méthodes pendant l'itération car cela ne soulève pas d'exception à cet endroit)

Le problème est que, lorsque les 3 champs (Jeu, Destinataire, et Commentaires) sont présents. J'obtiens l'exception "Object must implement IConvertible". MAIS si je supprime N'IMPORTE lequel des 3 champs (peu importe lequel), cela fonctionne très bien. Quelqu'un sait-il ce qui se passe ici ?

Merci d'avance !

Ryan.

1voto

Joe Points 632

C'est une supposition, mais je pensez à votre type anonyme pourrait essayer de type de canard à un enum lorsque vous avez plus de deux requêtes. Si c'est le cas, vous recevrez une plainte pour non-implémentation de IConvertible, car enum implémente IConvertible, et votre type anonyme (maintenant dérivé de enum) n'implémente pas l'interface.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X