链接查询:
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
SingleOrDefaultAsync()
方法。如果不存在这样的元素,则此方法返回序列中满足指定条件的唯一元素或默认值,并且如果序列中存在多个元素,则此方法将引发异常。
您可以尝试使用 FirstOrDefaultAsync 方法,它将返回序列的第一个元素,如果序列不包含元素,则返回默认值。或者使用您的解决方法(将 linq 查询转换为
IEnumerable<>
)。