首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.toList()返回异常

.toList()返回异常
EN

Stack Overflow用户
提问于 2019-10-02 11:11:00
回答 1查看 246关注 0票数 1

我有一个针对MySQL数据库运行的方法,结果是以下所有代码都是一个例外。

然后尝试了采取(10)方法的查询,它工作得很好,但还不知道原因。

我正在迭代的表有数百万行。有人能解释一下发生了什么吗?为什么?谢谢

代码语言:javascript
复制
public IHttpActionResult retentionRate() {   
        DateTime today = DateTime.Today;
        DateTime firstOfThisMonth = new DateTime(today.Year, today.Month, 1);
        DateTime  LastYearDate = DateTime.Today.AddDays(-365);

            var activeInDateRange = (from mp in FitnessDbo.memberproductinfoes
                                     where mp.mepi_expirydate >= LastYearDate &&
                                     mp.mepi_activationdate < today
                                     select new
                                     {
                                         mepi_memberproductinfoid = mp.mepi_memberproductinfoid,
                                         mepi_memberid = mp.mepi_memberid,
                                         mepi_activationdate = (mp.mepi_activationdate < LastYearDate ? LastYearDate : mp.mepi_activationdate),
                                         mepi_expirydate = (mp.mepi_expirydate > today ? today : mp.mepi_expirydate),
                                         mepi_prodtype = mp.mepi_prodtype,
                                         mepi_producttypeinfo = mp.mepi_producttypeinfo,
                                         mepi_memberproducttype = mp.mepi_memberproducttype,
                                         mepi_status = mp.mepi_status
                                     }).ToList();

        return Ok(activeInDateRange);
    }

用采取()方法:

代码语言:javascript
复制
public IHttpActionResult retentionRate() {

        DateTime today = DateTime.Today;
        DateTime firstOfThisMonth = new DateTime(today.Year, today.Month, 1);
        DateTime  LastYearDate = DateTime.Today.AddDays(-365);




           var activeInDateRange = (from mp in FitnessDbo.memberproductinfoes
                                     where mp.mepi_expirydate >= LastYearDate &&
                                     mp.mepi_activationdate < today
                                     select new
                                     {
                                         mepi_memberproductinfoid = mp.mepi_memberproductinfoid,
                                         mepi_memberid = mp.mepi_memberid,
                                         mepi_activationdate = (mp.mepi_activationdate < LastYearDate ? LastYearDate : mp.mepi_activationdate),
                                         mepi_expirydate = (mp.mepi_expirydate.Value > today? today : mp.mepi_expirydate),
                                         mepi_prodtype = mp.mepi_prodtype,
                                         mepi_producttypeinfo = mp.mepi_producttypeinfo,
                                         mepi_memberproducttype = mp.mepi_memberproducttype,
                                         mepi_status = mp.mepi_status
                                     }).Take(10);
}

我收到的例外

代码语言:javascript
复制
{"message":"An error has occurred.",
"exceptionMessage":"Calling 'Read' when the data reader is closed is not a valid operation.",
"exceptionType":"System.Data.Entity.Core.EntityCommandExecutionException",
"stackTrace":
   "   at System.Data.Entity.Core.Common.Internal.Materialization.Shaper\`1.HandleReaderException(Exception e)\r\n
       at System.Data.Entity.Core.Common.Internal.Materialization.Shaper\`1.StoreRead()\r\n   at System.Data.Entity.Core.Common.Internal.Materialization.Shaper\`1.SimpleEnumerator.MoveNext()\r\n
       at System.Data.Entity.Internal.LazyEnumerator\`1.MoveNext()\r\n
       at System.Collections.Generic.List\`1..ctor(IEnumerable\`1 collection)\r\n
       at System.Linq.Enumerable.ToList[TSource](IEnumerable\`1 source)\r\n
       at BI_leejam.Controllers.MembersController.retentionRate() in C:\\Users\\ahijazi\\source\\repos\\BI_leejam\\BI_leejam\\Controllers\\MembersController.cs:line 123\r\n
       at lambda_method(Closure , Object , Object[] )\r\n
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass6_2.<GetExecutor>b__2(Object instance, Object[] methodParameters)\r\n
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\r\n
       at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary\`2 arguments, CancellationToken cancellationToken)\r\n
    --- End of stack trace from previous location where exception was thrown ---\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
       at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext()\r\n
--- End of stack trace from previous location where exception was thrown ---\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
       at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext()\r\n
--- End of stack trace from previous location where exception was thrown ---\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
       at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()",
"innerException":{"message":"An error has occurred.",
    "exceptionMessage":"Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.",
    "exceptionType":"MySql.Data.MySqlClient.MySqlException",
    "stackTrace":
       "   at MySql.Data.MySqlClient.Interceptors.ExceptionInterceptor.Throw(Exception exception)\r\n
           at MySql.Data.MySqlClient.MySqlConnection.Throw(Exception ex)\r\n   at MySql.Data.MySqlClient.MySqlConnection.HandleTimeoutOrThreadAbort(Exception ex)\r\n
           at MySql.Data.MySqlClient.MySqlDataReader.Read()\r\n
           at MySql.Data.EntityFramework.EFMySqlDataReader.Read()\r\n
           at System.Data.Entity.Core.Common.Internal.Materialization.Shaper\`1.StoreRead()",
    "innerException":{"message":"An error has occurred.",
        "exceptionMessage":"Timeout in IO operation",
        "exceptionType":"System.TimeoutException",
        "stackTrace":
       "   at MySql.Data.MySqlClient.TimedStream.StopTimer()\r\n
           at MySql.Data.MySqlClient.TimedStream.Read(Byte[] buffer, Int32 offset, Int32 count)\r\n
           at MySql.Data.MySqlClient.MySqlStream.ReadFully(Stream stream, Byte[] buffer, Int32 offset, Int32 count)\r\n
           at MySql.Data.MySqlClient.MySqlStream.LoadPacket()\r\n
           at MySql.Data.MySqlClient.MySqlStream.ReadPacket()\r\n
           at MySql.Data.MySqlClient.NativeDriver.FetchDataRow(Int32 statementId, Int32 columns)\r\n
           at MySql.Data.MySqlClient.Driver.FetchDataRow(Int32 statementId, Int32 columns)\r\n
           at MySql.Data.MySqlClient.ResultSet.GetNextRow()\r\n
           at MySql.Data.MySqlClient.ResultSet.NextRow(CommandBehavior behavior)\r\n
           at MySql.Data.MySqlClient.MySqlDataReader.Read()"}}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-03 14:04:21

尝试将此添加到控制器中:

代码语言:javascript
复制
protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        if (this.FitnessDbo != null) { this.FitnessDbo.Dispose(); }
    }

    base.Dispose(disposing);
}

编辑以获得某些解释:

从注释中的问题来看,即使控制器在请求结束时被释放,上下文使用的连接仍被重用,但处于不可用的状态。当控制器被释放时,通过显式地处理上下文,上下文和连接应该被正确地关闭,以确保我们在下一个请求上得到一个新的连接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58200314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档