Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/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
LINQ:指定的强制转换无效_Linq_Linq To Sql - Fatal编程技术网

LINQ:指定的强制转换无效

LINQ:指定的强制转换无效,linq,linq-to-sql,Linq,Linq To Sql,我在以下代码行中出现随机错误(100页加载中有1个): topic = TopicsContext.GetCurrentDataContext().tTopics.Where(t => t.ContentId == contentId).SingleOrDefault(); ContentId属性和conntentId局部变量都是长的 最重要的是,错误是随机发生的,在大多数情况下,它工作正常 提前感谢你的想法 以下是完整的异常信息: Error Message: Specified c

我在以下代码行中出现随机错误(100页加载中有1个):

topic = TopicsContext.GetCurrentDataContext().tTopics.Where(t => t.ContentId == contentId).SingleOrDefault();
ContentId属性和conntentId局部变量都是长的

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

提前感谢你的想法

以下是完整的异常信息:

 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

我认为这是通过“SingleOrDefault()方法调用实现的。如果(t.contentId)存在(应该是唯一的键,对吗?),它会给您一个答案,但是如果数据库中不存在contentId,那么将返回默认值。“Default”的默认值将为null,这意味着赋值(=)的右侧将为null,并且您正试图将null强制转换为long

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

long? topic = ....
或者我将使用“Single()”并使用try-catch块进行包装,以处理密钥不存在的情况


无论如何,对于程序来说,这不应该是任何随机错误。

当我用一个版本的DB生成LINQ to SQL包装器并试图对另一个版本的DB使用它时,我得到了这个结果。在我的例子中,一个定义为short的列被更改为long,并且从DB中得到一个不能转换为long的值。确保LINQ to SQL包装器和数据库表同步。

我遇到了一个类似的错误,我有一个varchar(1)类型的列,它被映射到char而不是string。除非在将null强制转换为char时列值为null,否则此操作会引发“指定的强制转换无效”异常


有关更多详细信息,请参阅。

生成的SQL看起来像什么?它是否真的是随机的,即可以多次选择相同的数据并得到不同的结果?ContentId是外键吗?如果是,它能为空吗?是的,ContentId是FK。CONTANDI不可为空字段“它真的是随机的吗,这意味着您可以多次选择相同的数据并得到不同的结果?”-随机的意思是,大部分代码工作正常并返回正确的结果,我在大约1%的页面加载中描述了异常。不,主题是tTopic,不长。长字符串是ContentId和ContentId添加的try-catch,下次发生异常时将打印所有信息。哦,对不起,我没抓住要点。不过,尝试注入一个不存在的contentId,看看会发生什么?只是想确定singleordefault是否会给您带来错误。