查询语句优化
This commit is contained in:
parent
465cd239da
commit
d573fb73c4
@ -370,10 +370,10 @@ public class MyController : IDynamicApiController
|
|||||||
// 先查询原始数据,然后在内存中转换证书名称
|
// 先查询原始数据,然后在内存中转换证书名称
|
||||||
var query = _certificateRepository.AsQueryable()
|
var query = _certificateRepository.AsQueryable()
|
||||||
.LeftJoin<EventInfo>((c, e) => c.EventId == e.Id)
|
.LeftJoin<EventInfo>((c, e) => c.EventId == e.Id)
|
||||||
.LeftJoin<ProjectEntity>((c, e, p) => c.ProjectId == p.Id)
|
.LeftJoin<EventProject>((c, e, ep) => c.ProjectId == ep.Id)
|
||||||
.Where((c, e, p) => c.UserId == userId && c.CertificateStatus == 2 && !c.DeleteMark)
|
.LeftJoin<ProjectEntity>((c, e, ep, p) => ep.ProjectId == p.Id)
|
||||||
.Select((c, e, p) => new
|
.Where((c, e, ep, p) => c.UserId == userId && c.CertificateStatus == 2 && !c.DeleteMark)
|
||||||
{
|
.Select((c, e, ep, p) => new {
|
||||||
Id = c.Id,
|
Id = c.Id,
|
||||||
EventName = e.EventName,
|
EventName = e.EventName,
|
||||||
ProjectName = p.Name,
|
ProjectName = p.Name,
|
||||||
@ -451,24 +451,25 @@ public class MyController : IDynamicApiController
|
|||||||
var userId = GetCurrentUserId();
|
var userId = GetCurrentUserId();
|
||||||
var query = _pointsRecordRepository.AsQueryable()
|
var query = _pointsRecordRepository.AsQueryable()
|
||||||
.LeftJoin<EventInfo>((p, e) => p.EventId == e.Id)
|
.LeftJoin<EventInfo>((p, e) => p.EventId == e.Id)
|
||||||
.LeftJoin<ProjectEntity>((p, e, pr) => p.ProjectId == pr.Id)
|
.LeftJoin<EventProject>((p, e, ep) => p.ProjectId == ep.Id)
|
||||||
.LeftJoin<ProjectGroup>((p, e, pr, pg) => p.ProjectGroupId == pg.Id)
|
.LeftJoin<ProjectEntity>((p, e, ep, pr) => ep.ProjectId == pr.Id)
|
||||||
|
.LeftJoin<EventProjectGroup>((p, e, ep, pr, pg) => p.ProjectGroupId == pg.Id)
|
||||||
// 小程序端只查看个人积分:UserId = 当前用户且 MerchantCertificationId = null
|
// 小程序端只查看个人积分:UserId = 当前用户且 MerchantCertificationId = null
|
||||||
.Where((p, e, pr, pg) => p.UserId == userId && p.MerchantCertificationId == null && !p.DeleteMark);
|
.Where((p, e, ep, pr, pg) => p.UserId == userId && p.MerchantCertificationId == null && !p.DeleteMark);
|
||||||
|
|
||||||
if (input.Type.HasValue)
|
if (input.Type.HasValue)
|
||||||
{
|
{
|
||||||
var typeFilter = (PointsOperationType)input.Type.Value;
|
var typeFilter = (PointsOperationType)input.Type.Value;
|
||||||
query = query.Where((p, e, pr, pg) => p.Type == typeFilter);
|
query = query.Where((p, e, ep, pr, pg) => p.Type == typeFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果前端指定了 MerchantCertificationId,优先使用前端的(保持向后兼容)
|
// 如果前端指定了 MerchantCertificationId,优先使用前端的(保持向后兼容)
|
||||||
if (input.MerchantCertificationId.HasValue)
|
if (input.MerchantCertificationId.HasValue)
|
||||||
{
|
{
|
||||||
query = query.Where((p, e, pr, pg) => p.MerchantCertificationId == input.MerchantCertificationId.Value);
|
query = query.Where((p, e, ep, pr, pg) => p.MerchantCertificationId == input.MerchantCertificationId.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
var resultQuery = query.Select((p, e, pr, pg) => new MyPointsRecordDto
|
var resultQuery = query.Select((p, e, ep, pr, pg) => new MyPointsRecordDto
|
||||||
{
|
{
|
||||||
Id = p.Id,
|
Id = p.Id,
|
||||||
Title = p.Remark ?? (p.Type == PointsOperationType.Acquire ? "获取积分" : "消耗积分"),
|
Title = p.Remark ?? (p.Type == PointsOperationType.Acquire ? "获取积分" : "消耗积分"),
|
||||||
|
|||||||
@ -1511,12 +1511,13 @@ public class EventScoreService : BaseService<EventResult>, ITransient
|
|||||||
var list = await _certificateRepository.AsQueryable()
|
var list = await _certificateRepository.AsQueryable()
|
||||||
.LeftJoin<EventResult>((c, r) => c.ResultId == r.Id)
|
.LeftJoin<EventResult>((c, r) => c.ResultId == r.Id)
|
||||||
.LeftJoin<EventRegistration>((c, r, reg) => c.RegistrationId == reg.Id)
|
.LeftJoin<EventRegistration>((c, r, reg) => c.RegistrationId == reg.Id)
|
||||||
.LeftJoin<YD_Event.Core.Entities.Project>((c, r, reg, p) => c.ProjectId == p.Id)
|
.LeftJoin<EventProject>((c, r, reg, ep) => c.ProjectId == ep.Id)
|
||||||
.Where((c, r, reg, p) => c.EventId == input.EventId)
|
.LeftJoin<YD_Event.Core.Entities.Project>((c, r, reg, ep, p) => ep.ProjectId == p.Id)
|
||||||
.WhereIF(input.ProjectId.HasValue, (c, r, reg, p) => c.ProjectId == input.ProjectId)
|
.Where((c, r, reg, ep, p) => c.EventId == input.EventId)
|
||||||
.WhereIF(!string.IsNullOrWhiteSpace(input.GroupName), (c, r, reg, p) => c.GroupName == input.GroupName)
|
.WhereIF(input.ProjectId.HasValue, (c, r, reg, ep, p) => c.ProjectId == input.ProjectId)
|
||||||
.WhereIF(!string.IsNullOrWhiteSpace(input.Name), (c, r, reg, p) => c.ParticipantName.Contains(input.Name))
|
.WhereIF(!string.IsNullOrWhiteSpace(input.GroupName), (c, r, reg, ep, p) => c.GroupName == input.GroupName)
|
||||||
.Select((c, r, reg, p) => new CertificateExportDto
|
.WhereIF(!string.IsNullOrWhiteSpace(input.Name), (c, r, reg, ep, p) => c.ParticipantName.Contains(input.Name))
|
||||||
|
.Select((c, r, reg, ep, p) => new CertificateExportDto
|
||||||
{
|
{
|
||||||
CertificateNo = c.CertificateNo,
|
CertificateNo = c.CertificateNo,
|
||||||
ParticipantName = c.ParticipantName,
|
ParticipantName = c.ParticipantName,
|
||||||
|
|||||||
@ -749,7 +749,7 @@ public class UnifiedRegistrationService : ITransient
|
|||||||
|
|
||||||
var regItems = new List<EventRegistrationItem>();
|
var regItems = new List<EventRegistrationItem>();
|
||||||
var persons = new List<EventRegistrationPerson>();
|
var persons = new List<EventRegistrationPerson>();
|
||||||
var uniqueUserIds = new HashSet<long>(); // 用于去重的用户ID集合
|
var uniqueUserIds = new HashSet<long>(); // 用于去重的用户ID集合(仅用于单价赛事模式)
|
||||||
|
|
||||||
foreach (var item in input.Items)
|
foreach (var item in input.Items)
|
||||||
{
|
{
|
||||||
@ -817,10 +817,22 @@ public class UnifiedRegistrationService : ITransient
|
|||||||
await _registrationItemRepository.InsertRangeAsync(regItems);
|
await _registrationItemRepository.InsertRangeAsync(regItems);
|
||||||
await _registrationPersonRepository.InsertRangeAsync(persons);
|
await _registrationPersonRepository.InsertRangeAsync(persons);
|
||||||
|
|
||||||
// 使用去重后的用户数量计算金额
|
// 根据收费模式决定使用哪种人数计算金额
|
||||||
var totalAmount = CalculateTotalAmount(feeConfig, eventProjects, input.Items, uniqueUserIds.Count);
|
int countForCalculation;
|
||||||
|
if (feeConfig != null && feeConfig.ChargeMode == ChargeMode.UnitPriceEvent)
|
||||||
|
{
|
||||||
|
// 单价(赛事)模式:使用去重后的人数
|
||||||
|
countForCalculation = uniqueUserIds.Count;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 其他模式(包括单价项目):使用实际人数
|
||||||
|
countForCalculation = persons.Count;
|
||||||
|
}
|
||||||
|
|
||||||
return (totalAmount, uniqueUserIds.Count);
|
var totalAmount = CalculateTotalAmount(feeConfig, eventProjects, input.Items, countForCalculation);
|
||||||
|
|
||||||
|
return (totalAmount, countForCalculation);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -238,15 +238,16 @@ public class PointsRecordService : BaseService<PointsRecord>, ITransient
|
|||||||
{
|
{
|
||||||
var query = _repository.AsQueryable()
|
var query = _repository.AsQueryable()
|
||||||
.LeftJoin<EventInfo>((p, e) => p.EventId == e.Id)
|
.LeftJoin<EventInfo>((p, e) => p.EventId == e.Id)
|
||||||
.LeftJoin<YD_Event.Core.Entities.Project>((p, e, pr) => p.ProjectId == pr.Id)
|
.LeftJoin<EventProject>((p, e, ep) => p.ProjectId == ep.Id)
|
||||||
.LeftJoin<ProjectGroup>((p, e, pr, pg) => p.ProjectGroupId == pg.Id)
|
.LeftJoin<YD_Event.Core.Entities.Project>((p, e, ep, pr) => ep.ProjectId == pr.Id)
|
||||||
.Where((p, e, pr, pg) => !p.DeleteMark)
|
.LeftJoin<ProjectGroup>((p, e, ep, pr, pg) => p.ProjectGroupId == pg.Id)
|
||||||
.Where((p, e, pr, pg) => p.UserId == input.UserId)
|
.Where((p, e, ep, pr, pg) => !p.DeleteMark)
|
||||||
.WhereIF(input.Type.HasValue, (p, e, pr, pg) => p.Type == input.Type)
|
.Where((p, e, ep, pr, pg) => p.UserId == input.UserId)
|
||||||
.OrderByDescending((p, e, pr, pg) => p.CreatedTime);
|
.WhereIF(input.Type.HasValue, (p, e, ep, pr, pg) => p.Type == input.Type)
|
||||||
|
.OrderByDescending((p, e, ep, pr, pg) => p.CreatedTime);
|
||||||
|
|
||||||
return await query
|
return await query
|
||||||
.Select((p, e, pr, pg) => new PointsDetailOutput
|
.Select((p, e, ep, pr, pg) => new PointsDetailOutput
|
||||||
{
|
{
|
||||||
CreatedTime = p.CreatedTime,
|
CreatedTime = p.CreatedTime,
|
||||||
Type = p.Type,
|
Type = p.Type,
|
||||||
@ -264,16 +265,17 @@ public class PointsRecordService : BaseService<PointsRecord>, ITransient
|
|||||||
// input.UserId 在这里是 MerchantCertificationId
|
// input.UserId 在这里是 MerchantCertificationId
|
||||||
var query = _repository.AsQueryable()
|
var query = _repository.AsQueryable()
|
||||||
.LeftJoin<EventInfo>((p, e) => p.EventId == e.Id)
|
.LeftJoin<EventInfo>((p, e) => p.EventId == e.Id)
|
||||||
.LeftJoin<YD_Event.Core.Entities.Project>((p, e, pr) => p.ProjectId == pr.Id)
|
.LeftJoin<EventProject>((p, e, ep) => p.ProjectId == ep.Id)
|
||||||
.LeftJoin<ProjectGroup>((p, e, pr, pg) => p.ProjectGroupId == pg.Id)
|
.LeftJoin<YD_Event.Core.Entities.Project>((p, e, ep, pr) => ep.ProjectId == pr.Id)
|
||||||
.LeftJoin<YD_Event.Core.Entities.AppUser>((p, e, pr, pg, u) => p.UserId == u.Id && !u.DeleteMark)
|
.LeftJoin<ProjectGroup>((p, e, ep, pr, pg) => p.ProjectGroupId == pg.Id)
|
||||||
.Where((p, e, pr, pg, u) => !p.DeleteMark)
|
.LeftJoin<YD_Event.Core.Entities.AppUser>((p, e, ep, pr, pg, u) => p.UserId == u.Id && !u.DeleteMark)
|
||||||
.Where((p, e, pr, pg, u) => p.MerchantCertificationId == input.UserId)
|
.Where((p, e, ep, pr, pg, u) => !p.DeleteMark)
|
||||||
.WhereIF(input.Type.HasValue, (p, e, pr, pg, u) => p.Type == input.Type)
|
.Where((p, e, ep, pr, pg, u) => p.MerchantCertificationId == input.UserId)
|
||||||
.OrderByDescending((p, e, pr, pg, u) => p.CreatedTime);
|
.WhereIF(input.Type.HasValue, (p, e, ep, pr, pg, u) => p.Type == input.Type)
|
||||||
|
.OrderByDescending((p, e, ep, pr, pg, u) => p.CreatedTime);
|
||||||
|
|
||||||
return await query
|
return await query
|
||||||
.Select((p, e, pr, pg, u) => new PointsDetailOutput
|
.Select((p, e, ep, pr, pg, u) => new PointsDetailOutput
|
||||||
{
|
{
|
||||||
CreatedTime = p.CreatedTime,
|
CreatedTime = p.CreatedTime,
|
||||||
Type = p.Type,
|
Type = p.Type,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user