【问题标题】:Strange LINQ To Entities Exception奇怪的 LINQ 到实体异常
【发布时间】:2011-08-19 16:44:48
【问题描述】:

我正在使用一个 LINQ 语句,它从各种表中选择我需要填写一些 Post / Post Comment 样式记录的信息。我得到一个有趣的异常,说当我尝试迭代记录集时对象必须实现 IConvertible。有趣的是,它似乎只发生在我用来保存数据的匿名类型包含超过 2 个泛型集合时。

//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 连接器/网络,因此 LINQ 语句本身不支持 Take 和 FirstOrDefault 之类的东西,我选择在迭代期间使用这些方法,因为它不会在那里引发异常)

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

提前致谢!

瑞恩。

【问题讨论】:

  • 我尝试了多种方法,但目前我正在使用 foreach 循环
  • pquery.ToList() 会抛出异常吗?
  • 我会首先尝试对 MsSQL 运行相同的代码,如果它通过了,我会将其报告为 MySQL 连接器的错误,因为我在网络上发现了几个相关问题,仅在使用时描述了类似的问题mysql。例如:stackoverflow.com/questions/5741048/…
  • 所有建议似乎都是正确的,但真正奇怪的是,删除任何变量都会使其工作。我将从 Ladislavs 建议尝试针对 MSSQL 的代码开始。
  • 我已经设法通过更改数据库来解决此问题,使我能够选择“收件人”作为对象而不是实体集合(它之前是一个集合的原因是因为它具有可能为 null 并且在执行查询之前不完全支持一堆 Linq 扩展,例如“FirstOrDefault()”)。这使我可以选择其他 2 个集合,无一例外。还允许我将所有内容截断为单个语句,从而将查询执行时间缩短至约 200 毫秒(在远程数据库上)XD!

标签: c# .net mysql linq linq-to-entities


【解决方案1】:

这是一个猜测,但我认为当您有两个以上的查询时,您的匿名类型可能会尝试 duck-type 到一个枚举。如果发生这种情况,那么您将收到有关未实现 IConvertible 的抱怨,因为枚举实现了 IConvertible,并且您的匿名类型(现在从枚举派生)没有实现接口。

【讨论】:

  • 当一个包含普通属性和一组集合属性的实体被认为是一个枚举时,它的语义表明它是最远的东西,这似乎很奇怪。确实很奇怪。我还投票给你的答案,因为这很可能正是正在发生的事情,无论对我是否有意义,哈哈。如果我发现更多,我会将其标记为答案。
  • 我同意;这会很奇怪。我不太了解如何在 C# 中分析对象的语义以进行动态类型化,但值应该是增量的(我认为),而不是程序员可以选择枚举值的 C/C++。我们仍然处于猜测的范围内,但它不一定需要强制转换为枚举——它可以是任何实现 IConvertible 的类。
猜你喜欢
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多