C#StackTrace方法名称与源代码不一致

C#StackTrace方法名称与源代码不一致,c#,stack,stack-trace,C#,Stack,Stack Trace,我有一个例子,堆栈跟踪包含的方法名与源代码中的方法不一致。源代码调用.FirstOrDefault(),并抛出一个DbUpdateException,其中堆栈跟踪显示.SingleOrDefault() 这不是源代码与加载到进程空间的DLL版本不一致的情况。我确信这一点,因为: 此源代码从未调用过.SingleOrDefault() 为了验证DLL实际上包含对.FirstOrDefault()的调用,而不是对.SingleOrDefault()的调用,我执行了以下操作: 启动应用程序 使用Sy

我有一个例子,堆栈跟踪包含的方法名与源代码中的方法不一致。源代码调用
.FirstOrDefault()
,并抛出一个
DbUpdateException
,其中堆栈跟踪显示
.SingleOrDefault()

这不是源代码与加载到进程空间的DLL版本不一致的情况。我确信这一点,因为:

  • 此源代码从未调用过
    .SingleOrDefault()
  • 为了验证DLL实际上包含对
    .FirstOrDefault()
    的调用,而不是对
    .SingleOrDefault()
    的调用,我执行了以下操作:
    • 启动应用程序
    • 使用Sysinternals进程资源管理器在运行的进程空间中查找DLL
    • 从Process Explorer复制加载的DLL的完整路径
    • 将该DLL加载到JustDecompile中,并找到对
      .FirstOrDefault()的调用
  • 下面是刚刚反编译的代码(注意最后一行调用
    .FirstOrDefault()
    ):

    那么,有人能解释为什么运行时将
    .SingleOrDefault()
    而不是
    .FirstOrDefault()
    记录到堆栈跟踪中吗

    我在这里没有任何功能问题,代码的行为与我预期的一样。当有多个项通过相关查询的
    .Where(…)
    子句时,代码不会抛出
    InvalidOperationException
    .SingleOrDefault()
    所期望的
    无效操作异常。因此,代码的行为就像调用
    .FirstOrDefault()
    ,正如我所期望的那样。只是堆栈跟踪错误地显示它让我感到不安(它只让我感到不安,因为我不理解它!!)

    最后一件事。。。我有另一个同样奇怪行为的例子。简而言之,我的代码调用
    .LastOrDefault()
    ,但堆栈显示
    System.Linq.Enumerable.TryGetLast[TSource](IEnumerable`1 source,Boolean&found)
    。如果我在堆栈中看到
    .LastOrDefault()
    ,然后依次看到
    .LastOrDefault()
    调用
    .TryGetLast()
    ,我就会理解这一点,但是没有,我的代码似乎直接根据堆栈调用
    .TryGetLast()
    。所以,这很奇怪

    想法?谢谢

    ~z~史蒂夫

        private QueueEntry FetchNextQueueEntryOrDefault(long? queueEntryId, BatchProcessingQueueDefinition? queueDefinition, DefaultDbContext context)
        {
            DateTimeOffset now = DateTimeOffset.get_Now();
            IQueryable<QueueEntry> queryable = Queryable.Where<QueueEntry>(context.QueueEntries.Include<QueueEntry, QueueDefinitionSchedule>((QueueEntry x) => x.QueueDefinitionSchedule), (QueueEntry o) => (Int32)o.Status == 0);
            if (queueEntryId.get_HasValue())
            {
                queryable = Queryable.Where<QueueEntry>(queryable, (QueueEntry o) => (long?)o.Id == queueEntryId);
            }
            if (queueDefinition.get_HasValue())
            {
                queryable = Queryable.Where<QueueEntry>(queryable, (QueueEntry o) => (int?)o.QueueDefinitionId == (int?)queueDefinition);
            }
            queryable = Queryable.Where<QueueEntry>(queryable, (QueueEntry o) => (o.DoNotExecuteUntilMoment == null) || (o.DoNotExecuteUntilMoment <= (DateTimeOffset?)now));
            return Queryable.FirstOrDefault<QueueEntry>(queryable);
        }
    
    Microsoft.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.   
    ---> System.ComponentModel.Win32Exception (258): The wait operation timed out.  
       at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)  
       at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)  
       at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)  
       at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)  
       at Microsoft.Data.SqlClient.SqlDataReader.TryConsumeMetaData()  
       at Microsoft.Data.SqlClient.SqlDataReader.get_MetaData()  
       at Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)  
       at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean isAsync, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)  
       at Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String method)  
       at Microsoft.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)  
       at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)  
       at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.InitializeReader(DbContext _, Boolean result)  
       at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)  
       at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()  
       at *** System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source) ***  
       at DataAccess.Repositories.QueueEntryExecutionRepository.FetchNextQueueEntryOrDefault(Nullable`1 queueEntryId, Nullable`1 queueDefinition, DefaultDbContext context) in E:\Work\Clients\Schaneville\CryptoBot\src\DataAccess\Repositories\QueueEntryExecutionRepository.cs:line 103  
       at DataAccess.Repositories.QueueEntryExecutionRepository.FetchNextQueueEntryOrDefaultWithConcurrencyCheck(Nullable`1 queueEntryId, Nullable`1 queueDefinition, DefaultDbContext context, TransactionScope scope) in E:\Work\Clients\Schaneville\CryptoBot\src\DataAccess\Repositories\QueueEntryExecutionRepository.cs:line 83  
       at DataAccess.Repositories.QueueEntryExecutionRepository.TryFetchNextQueueEntryForExecution(Nullable`1 queueEntryId, Nullable`1 queueDefinition) in E:\Work\Clients\Schaneville\CryptoBot\src\DataAccess\Repositories\QueueEntryExecutionRepository.cs:line 54  
       at DataAccess.Repositories.QueueEntryExecutionRepository.TryFetchNextQueueEntryForExecution(BatchProcessingQueueDefinition queueDefinition) in E:\Work\Clients\Schaneville\CryptoBot\src\DataAccess\Repositories\QueueEntryExecutionRepository.cs:line 42  
       at Core.Framework.Commands.BatchProcessing.Services.ExecuteNextQueueEntryService.Execute(BatchProcessingQueueDefinition queueDefinition) in E:\Work\Clients\Schaneville\CryptoBot\src\Core\Framework\Commands\BatchProcessing\Services\ExecuteNextQueueEntryService.cs:line 98  
       at Core.Framework.Commands.BatchProcessing.Services.ExecutePendingQueueEntriesService.InvokeService(IExecuteNextQueueEntryService service) in E:\Work\Clients\Schaneville\CryptoBot\src\Core\Framework\Commands\BatchProcessing\Services\ExecutePendingQueueEntriesService.cs:line 100  
       at Core.Framework.Commands.BatchProcessing.Services.ExecutePendingQueueEntriesService.ProcessOneQueueEntry() in E:\Work\Clients\Schaneville\CryptoBot\src\Core\Framework\Commands\BatchProcessing\Services\ExecutePendingQueueEntriesService.cs:line 75  
       at Core.Framework.Commands.BatchProcessing.Services.ExecutePendingQueueEntriesService.TryProcessOneQueueEntry() in E:\Work\Clients\Schaneville\CryptoBot\src\Core\Framework\Commands\BatchProcessing\Services\ExecutePendingQueueEntriesService.cs:line 61  ClientConnectionId:2c8ecfdc-2b17-4371-913c-a34158a53600  Error Number:-2,State:0,Class:11