Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 奇怪的LINQ到实体异常_C#_.net_Mysql_Linq_Linq To Entities - Fatal编程技术网

C# 奇怪的LINQ到实体异常

C# 奇怪的LINQ到实体异常,c#,.net,mysql,linq,linq-to-entities,C#,.net,Mysql,Linq,Linq To Entities,我正在使用一个LINQ语句,它从各种表中选择我需要填充一些Post/Post注释样式记录的信息。我得到一个有趣的异常,当我尝试迭代记录集时,对象必须实现IConvertible。有趣的是,似乎只有当我用来保存数据的匿名类型包含两个以上的泛型集合时,才会出现这种情况 //select friend timeline posts posts var pquery = from friend in fquery join post in db.game_timeline on friend.i

我正在使用一个LINQ语句,它从各种表中选择我需要填充一些Post/Post注释样式记录的信息。我得到一个有趣的异常,当我尝试迭代记录集时,对象必须实现IConvertible。有趣的是,似乎只有当我用来保存数据的匿名类型包含两个以上的泛型集合时,才会出现这种情况

//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 }
    };
注意:我使用的是MYSQL Connector/Net,所以像Take和FirstOrDefault之类的东西在LINQ语句本身中不受支持,我选择在迭代期间使用这些方法,因为它不会在那里引发异常

问题是,当游戏、收件人和评论这三个字段都存在时。我得到异常对象必须实现IConvertible。但是,如果我删除3个字段分配中的任何一个,不管是哪一个,它都可以正常工作。有人知道这里发生了什么吗

提前谢谢


Ryan。

这是一个猜测,但我认为当您有两个以上的查询时,您的匿名类型可能正在尝试访问枚举。如果发生这种情况,那么您将收到关于没有实现IConvertible的投诉,因为enum实现IConvertible,而您现在从enum派生的匿名类型没有实现接口

我尝试了多种方法,但目前我正在使用foreach loopdoes pquery.ToList抛出异常?我会首先尝试对MsSQL运行相同的代码,如果通过,我会将其报告为MySQL连接器的错误,因为我在web上发现了几个相关问题,仅在使用MySQL时才描述类似的问题。例如:所有的建议似乎都是正确的,但真正奇怪的是,删除任何变量都能使其工作。我将从Ladislav的建议开始,尝试针对MSSQL编写代码。我已经设法解决了这个问题,通过对数据库进行更改,使我能够选择收件人作为对象,而不是实体集合。以前它是集合的原因是因为它可能为null,而大量Linq扩展不可用在执行查询之前完全支持,例如“FirstOrDefault”。这允许我选择其他2个集合,不会引发任何异常。还允许我将所有内容截断为一条语句,使查询在远程数据库XD上的执行速度达到~200ms!如果一个包含普通属性和一组集合属性的实体的语义表明它是最远的枚举,那么它就会被视为枚举,这似乎很奇怪。真奇怪。我选了你的答案,因为这很可能就是正在发生的事情,无论它对我是否有意义。lol。如果我发现更多,我会把它标记为一个答案。我同意;这会很奇怪。我不太了解如何在C中为动态类型分析对象的语义,但我认为值应该是增量的,而不是程序员可以选择枚举值的C/C++。在这里,我们仍然处于猜测的范围内,但它不一定需要强制转换到enum——它可以是实现IConvertible的任何类。