【发布时间】: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