2010-11-26 153 views
1

我一直在使用LINQ的工作,现在到SQL一段时间,我从来没有问题......到现在为止。我有一个将查询发送到数据库的方法,但与其他时间不同,我无法将结果(无论是List还是Array)转换。方法如下:问题与LINQ to SQL的

public List<vwContainer> GetConteinerPorto(int id) 
{ 
    return (from cont in db.vwContainers 
      where cont.idHarbor == id 
      orderby cont.Year 
      select cont).ToList(); 
} 

我试过了它的一些变体,但总是会出现“指定的转换无效”的结果。抛出异常。你们能给我点光吗?

堆栈跟踪:

[InvalidCastException: Specified cast is not valid.] 
    System.Data.SqlClient.SqlBuffer.get_Int32() +6271252 
    Read_vwCargas_movimentadas_conteiner(ObjectMaterializer`1) +636 
    System.Data.Linq.SqlClient.ObjectReader`2.MoveNext() +42 
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +472 
    System.Linq.Enumerable.ToList(IEnumerable`1 source) +80 
    WebPortosSEP.Web.Models.PortoRepository.GetConteinerPorto(Int32 id) +867 
    WebPortosSEP.Web.Controllers.PortoController.Cargas(Int32 id) +255 
    lambda_method(Closure , ControllerBase , Object[]) +112 
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +258 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39 
    System.Web.Mvc.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() +125 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +640 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +312 
    System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +709 
    System.Web.Mvc.Controller.ExecuteCore() +162 
    System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +58 
    System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371 
+1

什么是确切的错误?这会给你一个线索,因为它将包括它不能投射的类型。 – 2010-11-26 17:19:50

+0

请参阅http://stackoverflow.com/questions/8332060/linq-executequery-error/23949896#23949896。 – admintehran 2014-05-30 08:36:31

回答

4

这可能是因为在数据库中的类型的列和.Net类型之间的不匹配。

当从数据库中读取像cont.idHarbor和cont.Year字段的值,并转换成.NET类型所得到的类型可能不匹配在类的那些属性。

检查idHarbor是BIGINT数据库,并把你与一个int比较它。同时检查年份字段类型。你可以从堆栈跟踪中找出线索。是由SqlDataReader.GetInt64或任何类似的方法引发的异常?

2

这似乎是cont实际上不是vwContainer

+0

如果是这样的话,编译时是否会出现错误? – codymanix 2010-11-26 17:21:20

+0

尝试一下,通过“从vwContainer cont in ...”或“.. select(vwContainer)cont”执行,并明确地将“cont”转换为vwContainer。 – VVS 2010-11-26 18:08:50

+0

试过VVS解决方案,但没有奏效。另外,当我将鼠标悬停时,intelisense说它来自正确的类型。 – 2010-11-26 18:34:56

0

你的方法不包含任何演员。 您确定Exception是从方法内部抛出而不是从其调用位置抛出?

+0

我很确定。我重新安排了很多次,并且还使用了其他表格(可以工作)。 – 2010-11-26 18:35:47

0

试试这个:

public List<vwContainer> GetConteinerPorto(int id) 
{ 
    return (from cont in db.vwContainers 
      where cont.idHarbor == id 
      orderby cont.Year 
      select cont).ToList<vwContainer>(); 
} 
+0

尝试并收到相同的结果。 – 2010-11-26 18:36:58

0

这是可能的,你改变了数据库架构(例如进入到一个字符串),并没有更新DBML(你只会看到在运行时,这个错误,当您第一次访问有错误的表)

0

如果它是一个运行时异常而不是编译tome错误,那么问题几乎可以肯定的是你的dbml文件在某个级别上与数据库不同步。当你在同一个命名空间中有多个dbml文件时,我也会遇到类似的问题。

尝试删除有问题的表与DBML文件并重新创建它。

UPDATE:

根据您的堆栈跟踪,我觉得非常可疑了lambda方法内发生的异常,但你所种的是代码不包括任何lambda表达式。这并不是说可能没有内部lambda继续,但我不这么认为。

另外请注意,您的堆栈跟踪包括这样的:

Read_vwCargas_movimentadas_conteiner

这是从您发布的代码不同。

更新2:

的异常在一个Int32转换,这表明您的数据列中的一个未正确定义存在的。你是否将类型从可为空改为不可空?