在没有明显原因的情况下获得投射错误

时间:2017-03-30 14:04:44

标签: c# .net entity-framework linq

我有这段代码一直在抛出一个投射错误,我不知道为什么玩了半个小时之后。这是一段代码:

var zips = DB.Get<Partner_to_ZipCode>()
                .AsQueryable()
                .Include(i => i.Partner)
                .Where(w => w.Partner.Id == id)
                .Select(s => s.ZipCode)
                .ToArray();

它指向控制器的第146行,这就是这个linq查询。 “Partner.Id”是“id”的整数,ZipCode是一个字符串。我不知道这里发生了什么。我试过注释掉代码片段,转换变量,将数组从泛型更改为特定类型,但没有做任何事情。任何帮助将不胜感激。

错误消息是:

  

{“message”:“发生错误。”,“exceptionMessage”:“从物化'System.Int32'类型到'System.String'类型的指定强制转换无效。“,”exceptionType“:” System.InvalidOperationException “,”stackTrace“:”在System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader)在System.Data.Entity.Core.Common.Internal的System.Data.Entity.Core.Common.Internal.Materialization.Shaper.GetColumnValueWithErrorHandling [TColumn](Int32 ordinal)\ r \ n中的读取器,Int32序号)\ r \ n .Materialization.Coordinator`1.ReadNextElement(Shaper shaper)\ r \ n在System.Linq.Buffer的System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()\ r \ n中System.Linq.Enumerable.ToArray [TSource](IEnumerable`1 source)中的`1..ctor(IEnumerable`1 source)\ r \ n在PMP.MVC.Controllers.PartnerController.GetTasks(Int32 id)中的\ r \ n在c:\\ Users \\ maran \\ OneDrive \\ Documents \\ RF \\ main \\ src \\ PMP.MVC \\ PMP.MVC \\ Controlle rs \\ PartnerController.cs:第146行\ r \ n在lambda_method(Closure,Object,Object [])\ r \ n在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.c__DisplayClass10.b__9(对象实例,对象[ ] systemParameters)\ r \ n在System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext,IDictionary`2 arguments,CancellationToken cancellationToken)\ r \ n ---从前一个引发异常的位置的堆栈跟踪结束 - - \ r \ n在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n在System.Runtime.CompilerServices.TaskAwaiter System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\ r \ n中的1.GetResult()\ r \ n \ n ---从抛出异常的上一个位置开始的堆栈跟踪结束--- \ r \ n在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务个)\ r \ n在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult(个)\ r \ n在System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext ()\ r \ n ---从抛出异常的上一个位置开始的堆栈跟踪结束---在System.Runtime的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n中的\ r \ n。 CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult(个)\ r \ n在System.Web.Http.Controllers.ExceptionFilterResult.d__0.MoveNext(个)\ r \ n ---抛出异常的前一个位置的堆栈跟踪结束---在System.Web.Http.Controllers.ExceptionFilterResult.d__0的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\ r \ n中的\ r \ n .MoveNext()\ r \ n ---从抛出异常的上一个位置开始的堆栈跟踪结束--- \ r \ n在System.Runtime.CompilerServices.Task Awaiter.ThrowForNonSuccess(任务任务)\ r \ n在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult(个)\ r \ n的系统。 Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()“}   

2 个答案:

答案 0 :(得分:0)

这两个中的一个可能有效:

.Where(w => w.Partner.Id.ToString() == id)

.Where(w => w.Partner.Id == id.ToString())

其中一个:局部变量“id”或w.Partner.Id是一个字符串,另一个是int。
将int转换为字符串比使用其他方式更安全,因为字符串可能包含除数字之外的其他内容,您需要处理该情况。

答案 1 :(得分:0)

var zips = DB.Get<Partner_to_ZipCode>()
.AsQueryable()
.Include(i => i.Partner)
.Where(w => w.Partner.Id.ToString() == id) // or (w => w.Partner.Id == int.Parse(id)) if id is an integer
.Select(s => s.ZipCode)
.ToArray();