LINQ:指定的转换无效

3

我在以下代码行中遇到了随机错误(每100个页面加载中有1个):

topic = TopicsContext.GetCurrentDataContext().tTopics.Where(t => t.ContentId == contentId).SingleOrDefault();

ContentId属性和contentId本地变量都是long类型。

最重要的是,错误是随机发生的,在大多数情况下它能正常工作。

感谢您的建议。

以下是完整的异常信息:

 Error Message: Specified cast is not valid.
 Error Source: System.Data.Linq
 Error Stack Trace: 
   at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
   at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source)
   at Topics.BusinessLogic.Models.Services.TopicService.GetTopic(String title) in C:\rabota\topics\source\trunk\Topics.BusinessLogic\Models\Services\TopicService.cs:line 65

2
它真的是随机的吗?也就是说,你可以多次选择相同的数据并得到不同的结果吗? - Geoff
ContentId是外键吗?如果是,它可以为空吗? - Benjamin Autin
是的,ContentId是外键。ContentId字段不可为空。 - Sergey Osypchuk
我猜测可能选择了一个不是 long 类型的值。这可能是你数据中的空值。 - Geoff
如果您将一个失败的记录与一个成功的记录进行比较,数据类型或长度上是否有明显的差异? - Geoff
显示剩余5条评论
3个回答

3

当我使用某个版本的数据库生成LINQ-to-SQL包装器并尝试将其用于不同版本的数据库时,我遇到了这个问题。在我的情况下,一个被定义为short的列被改成了long,并且从数据库中出来的值无法转换为long。确保你的LINQ-to-SQL包装器和数据库表是同步的。


0

我认为问题出在 "SingleOrDefault()" 方法调用上。它的作用是,如果 (t.contentId) 存在(应该是唯一键,对吧?),它将给你一个单一的答案,但如果 contentId 在数据库中不存在,则会返回默认值。默认值默认情况下将为 null,这意味着赋值符号 (=) 的右侧将为 null,您正在尝试将 null 强制转换为 long。

解决方案是,您可以将主题设置为可空类型:

long? topic = ....

或者我会使用 "Single()" 并用 try catch 块包装以处理键不存在的情况。

无论如何,程序不应该出现任何随机错误。


不,主题是一个tTopic,不是长整型。长整型是ContentId和contentId。 - Benjamin Autin
我添加了try catch,并且下次发生异常时将打印所有信息。 - Sergey Osypchuk
哦,抱歉我误解了。不过,试着注入一个不存在的contentId,看看会发生什么?只是想确保singleordefault是否会给你错误。 - xandy

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接