首页 文章

LINQ-Expression失败,但foreach循环工作实体框架

提问于
浏览
2

我的应用程序是ASP.NET Core 1.0 Web API .

我的代码中有以下LINQ-Expression:

int number = 0;
var orders = await this.DataRepo.Where(data => data.number == number).ToListAsync();

如果我尝试运行代码它失败并给我以下错误消息:

Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory:错误:迭代查询结果时数据库中发生异常 . System.Data.SqlClient.SqlException:超时已过期 . 操作完成之前经过的超时时间或服务器没有响应 . ---> System.ComponentModel.Win32Exception:Der Wartevorgang wurde abgebrochen ---内部异常堆栈跟踪结束---在System.Threading的System.Data.SqlClient.SqlCommand . <> c.b__107_0(任务1结果) System.Threading.Tasks.Task.Execute()中的.Tasks.ContinuationResultTaskFromResultTask2.InnerInvoke()---抛出异常的前一个位置的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(位于Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.d__20.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的任务任务---从抛出异常的上一个位置开始的堆栈跟踪结束--- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务),位于Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable.AsyncEnumerator.d__8.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) - 抛出异常的先前位置的堆栈跟踪结束---在Microsoft.EntityFrameworkCore.Query的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处 . Internal.AsyncLinqOperatorProvider.SelectAsyncEnumerable2.SelectAsyncEnumerator.d__4.MoveNext()---从抛出异常的先前位置开始的堆栈跟踪结束---在System.Runtime的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.SelectAsyncEnumerable2.SelectAsyncEnumerator.d__4.MoveNext()中的.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)---从抛出异常的上一个位置开始的堆栈跟踪结束--- at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugg中的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor1.EnumeratorExceptionInterceptor.d__5.MoveNext()中的erNotification(任务任务)ClientConnectionId:64923a0e-cf94-487c-be83-a43b719d8c45错误号:-2,状态:0,类: 11 System.Data.SqlClient.SqlException:超时已过期 . 操作完成之前经过的超时时间或服务器没有响应 . ---> System.ComponentModel.Win32Exception:Der Wartevorgang wurde abgebrochen ---内部异常堆栈跟踪结束---在System.Threading的System.Data.SqlClient.SqlCommand . <> c.b__107_0(任务1结果) System.Threading.Tasks.Task.Execute()中的.Tasks.ContinuationResultTaskFromResultTask2.InnerInvoke()---抛出异常的前一个位置的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(位于Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.d__20.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的任务任务---从抛出异常的上一个位置开始的堆栈跟踪结束--- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务),位于Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable.AsyncEnumerator.d__8.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) - 抛出异常的先前位置的堆栈跟踪结束---在Microsoft.EntityFrameworkCore.Query的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处 . Internal.AsyncLinqOperatorProvider.SelectAsyncEnumerable2.SelectAsyncEnumerator.d__4.MoveNext()---从抛出异常的上一个位置开始的堆栈跟踪结束--- atSystem.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.SelectAsyncEnumerable2.SelectAsyncEnumerator.d__4.MoveNext() - - 抛出异常的先前位置的堆栈跟踪结束---在Microsoft.EntityFrameworkCore.Query的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor1.EnumeratorExceptionInterceptor.d__5.MoveNext()ClientConnectionId:64923a0e-cf94-487c-be83-a43b719d8c45错误号:-2,状态:0,类:11Ausnahmeausgelöst:“System.Data.SqlClient . System.Private.CoreLib.ni.dll中的“SqlException”

但是,如果我将LINQ-Expression更改为以下循环,一切正常:

var orders = new List<ExampleClass>();
int number = 0;

foreach (var data in DataRepo)
{
   if (data.number == number)
   {
      orders.Add(data);
   }
}

我没见过有同样问题的人..

有谁知道为什么会这样?非常感谢你

1 回答

  • 3

    由于SQL客户端报告了超时,我想这不是Linq Expression的问题,而是对数据库执行编译的SQL语句 . 该例外提供了两个提示:

    • 完成操作之前经过的超时时间

    • 服务器没有响应

    Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory:错误:迭代查询结果时数据库中发生异常 . System.Data.SqlClient.SqlException:超时已过期 . 操作完成之前经过的超时时间或服务器没有响应 .

    关于第二个代码在超时期限内将整个表加载到内存中的事实,我们可以排除第二个选项 .

    The default timeout of the SQL Connection is 15 seconds.这应该适合执行您的代码将生成的简单查询 . 当加载整个表比使用where子句中的单个参数过滤更快时,索引很可能存在问题:

    • 缺少索引'number'

    • 索引高度碎片化或其统计数据未达标日期

    • 索引不合适,因为数千行'number' = 0

    • 表的聚簇索引是分段的

    • 其他原因

    为了将问题集中在数据库中,我将提取SQL查询 - 通过在调试器中跟踪SQL字符串或使用SQL Server Profiler - 在SQL Server Management Studio中执行它并分析执行计划以获取更多信息 .

    为了排除异步查询执行的副作用,我还会在默认的同步上下文中进行一些测试 .

相关问题