簡體   English   中英

LINQ-Expression失敗,但是foreach循環有效Entity-Framework

[英]LINQ-Expression fails but foreach loop works Entity-Framework

我的應用程序是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.Data.SqlClient.SqlCommand。<> c.b__107_0(Task`1結果)在System.Threading System.Threading.Tasks.Task.Execute()上的.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()-從上一個引發異常的位置開始的堆棧跟蹤--在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess( (任務任務)位於System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務)位於Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.d__20.MoveNext()---從上次引發異常的位置開始的堆棧跟蹤-在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務)在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務)在Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable.AsyncEnumerator.d__8.MoveNext -從上一個引發異常的位置開始的堆棧跟蹤--在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務)在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務)在Microsoft.EntityFrameworkCore.Query。 Internal.AsyncLinqOperatorProvider.SelectAsyncEnumerable`2.SelectAsyncEnumerator.d__4.MoveNext()-從上次引發異常的位置開始的堆棧跟蹤-在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務)在System.Runtime Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.SelectAsyncEnumerable`2.SelectAsyncEnumerator.d__4.MoveNext()上的.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務)-從引發異常的先前位置開始的堆棧跟蹤- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務)位於System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugg Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor`1.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.Data.SqlClient.SqlCommand。<> c.b__107_0(Task`1結果)在System.Threading System.Threading.Tasks.Task.Execute()上的.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()-從上一個引發異常的位置開始的堆棧跟蹤--在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess( (任務任務)位於System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務)位於Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.d__20.MoveNext()---從上次引發異常的位置開始的堆棧跟蹤-在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務)在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務)在Microsoft.EntityFrameworkCore.Query.Internal.AsyncQueryingEnumerable.AsyncEnumerator.d__8.MoveNext -從上一個引發異常的位置開始的堆棧跟蹤--在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務)在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務)在Microsoft.EntityFrameworkCore.Query。 Internal.AsyncLinqOperatorProvider.SelectAsyncEnumerable`2.SelectAsyncEnumerator.d__4.MoveNext()-從上次引發異常的位置開始的堆棧跟蹤-在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務)在System.Runtime Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.SelectAsyncEnumerable`2.SelectAsyncEnumerator.d__4.MoveNext()上的.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務)-從引發異常的先前位置開始的堆棧跟蹤- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務)位於System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebugg Microsoft.EntityFrameworkCore.Query.Internal.AsyncLinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.d__5.MoveNext()的erNotification(任務任務)ClientConnectionId:64923a0e-cf94-487c-be83-a43b719d8c45錯誤編號:-2,狀態:0,類別: 11位用戶反饋:System.Private.CoreLib.ni.dll中的“ System.Data.SqlClient.SqlException”

但是,如果將LINQ-Expression更改為以下循環,則一切正常:

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

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

我還沒有看到有同樣問題的人..

有誰知道為什么會這樣嗎? 非常感謝你

由於超時是由SQL Client報告的,因此我想這不是Linq Expression的問題,而是針對數據庫執行已編譯的SQL語句的問題。 該異常提供了兩個提示:

  • 操作完成之前經過的超時時間
  • 服務器沒有響應

Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory:錯誤:迭代查詢結果時數據庫中發生了異常。 System.Data.SqlClient.SqlException:超時已過期。 在操作完成之前超時或服務器沒有響應。

關於第二個代碼在超時時間內將整個表加載到內存這一事實,我們可以排除第二個選項。

SQL連接的默認超時為15秒。 這應該適合執行簡單的查詢,例如您的代碼將生成的查詢。 當整個表的加載比用where子句中的單個參數過濾時快時,索引很可能出現問題:

  • 缺少“數字”索引
  • 索引高度分散或其統計信息尚未更新
  • 該索引不合適,因為數千行的'number'= 0
  • 表的聚集索引是分散的
  • 其他原因

為了將問題集中在數據庫中,我將提取SQL查詢-通過在調試器中跟蹤SQL字符串或使用SQL Server Profiler-在SQL Server Management Studio中執行它並分析執行計划以獲取更多信息。

為了排除異步查詢執行的副作用,我還將在默認的同步上下文中進行一些測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM