序列包含多个错误[异常]

问题描述 投票:0回答:1

链接查询:

        var previousAudit = DbContext.AuditInspections
        .AsNoTracking()
        .Where(i => i.CreationDateTime >= financialYearStart.AddYears(-1) &&
                    i.CreationDateTime <= financialYearStart.AddDays(-1) &&
                    i.SiteModelId == inspectionData.SiteId &&
                    i.FlowStateModel.Name == StateEnums.AuditReportReleased)
        .OrderByDescending(i => i.CreationDateTime)
        .Select(i => new
        {
            i.Id,
            i.AuditDateTime,
            i.DeadlineDateTime,
            Score = i.AuditInspectionQuestionModels
                .GroupBy(q => new
                {
                    q.AuditQuestionPriority,
                    q.AuditChoice
                })
                .Select(g => new
                {
                    g.Key.AuditQuestionPriority,
                    g.Key.AuditChoice,
                    Count = g.Count()
                })
                .ToList()
        })
        .FirstOrDefault();

SQL 生成:

SELECT [t].[Id], [t].[AuditDateTime], [t].[DeadlineDateTime], [t].[Id0], [t0].[AuditQuestionPriority], [t0].[AuditChoice], [t0].[Count]
FROM (
    SELECT TOP(1) [a].[Id], [a].[AuditDateTime], [a].[DeadlineDateTime], [f].[Id] AS [Id0], [a].[CreationDateTime]
    FROM [AuditInspections] AS [a]
    INNER JOIN [FlowStates] AS [f] ON [a].[FlowStateModelId] = [f].[Id]
    WHERE [a].[CreationDateTime] >= @__AddYears_0 AND [a].[CreationDateTime] <= @__AddDays_1 AND [a].[SiteModelId] = @__inspectionData_SiteId_2 AND [f].[Name] = N'Audit Report Released'
    ORDER BY [a].[CreationDateTime] DESC
) AS [t]
OUTER APPLY (
    SELECT [a0].[AuditQuestionPriority], [a0].[AuditChoice], COUNT(*) AS [Count]
    FROM [AuditInspectionQuestions] AS [a0]
    WHERE [t].[Id] = [a0].[AuditInspectionModelId]
    GROUP BY [a0].[AuditQuestionPriority], [a0].[AuditChoice]
) AS [t0]
ORDER BY [t].[CreationDateTime] DESC, [t].[Id], [t].[Id0], [t0].[AuditQuestionPriority]

错误:

执行请求时发生未处理的异常。 System.InvalidOperationException:序列包含多个元素。 在异步任务 Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync(IAsyncEnumerable asyncEnumerable, CancellationToken CancellationToken) x 2 在 C:/Usera/Project/msTest/ios_api/Controllers/Features/AuditModule/Inspection/AuditInspectionController.cs 中的异步任务 ios_api.Controllers.Features.AuditModule.Inspection.AuditInspectionController.ShareAuditInspectionReports(int InspectionId, ReportRecipients reportRecipients) 处:第 2986 行

当我将 linq 查询转换为

IEnumerable<>
时,错误已解决:

            var previousAudit = DbContext.AuditInspections
            .AsNoTracking()
            .Where(i => i.CreationDateTime >= financialYearStart.AddYears(-1) &&
                        i.CreationDateTime <= financialYearStart.AddDays(-1) &&
                        i.SiteModelId == inspectionData.SiteId &&
                        i.FlowStateModel.Name == StateEnums.AuditReportReleased)
            .OrderByDescending(i => i.CreationDateTime)
            .Include(auditInspectionModel => auditInspectionModel.AuditInspectionQuestionModels)
            .ToList()
            .Select(i => new
            {
                i.Id,
                i.AuditDateTime,
                i.DeadlineDateTime,
                Score = i.AuditInspectionQuestionModels
                    .GroupBy(q => new
                    {
                        q.AuditQuestionPriority,
                        q.AuditChoice
                    })
                    .Select(g => new
                    {
                        g.Key.AuditQuestionPriority,
                        g.Key.AuditChoice,
                        Count = g.Count()
                    })
                    .ToList()
            })
            .FirstOrDefault();

只需删除 linq 查询的

line:5
,也消除了错误:

i.SiteModelId == InspectionData.SiteId &&

我确信

inspectionData.SiteId
是一个
int
值,而不是
List<T>

任何人都可以解释为什么我会收到此错误吗?

我正在使用

.net 8.0

c# sql-server entity-framework linq-to-sql asp.net-core-webapi
1个回答
0
投票

问题涉及

SingleOrDefaultAsync()
方法。如果不存在这样的元素,则此方法返回序列中满足指定条件的唯一元素或默认值,并且如果序列中存在多个元素,则此方法将引发异常

您可以尝试使用 FirstOrDefaultAsync 方法,它将返回序列的第一个元素,如果序列不包含元素,则返回默认值。或者使用您的解决方法(将 linq 查询转换为

IEnumerable<>
)。

© www.soinside.com 2019 - 2024. All rights reserved.