raw query to EF query #1833 (#2)

Co-authored-by: harid <harid_pr61@live.rmutl.com>
This commit is contained in:
Harid Promsri 2025-10-09 14:04:32 +07:00 committed by GitHub
parent f3cdb61581
commit 80d678a582
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2013,102 +2013,86 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
if (periodExam == null) if (periodExam == null)
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound); return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
var data = new List<dynamic>(); var query = _context.Disables
var p_Id = new MySqlParameter("@id", id); .Include(x => x.PeriodExam)
int total = 0; .Include(x => x.Educations)
.Include(x => x.Certificates)
// --------------------------- .OrderBy(x => x.ExamId)
// 1. ดึงรายละเอียดสอบ (exam_info) .Where(x => x.PeriodExam != null && x.PeriodExam.Id == id);
// ---------------------------
using (var cmd = _context.Database.GetDbConnection().CreateCommand())
{
cmd.CommandTimeout = 0;
var sb = new StringBuilder();
sb.Append(@"
SELECT
examID, profileID, prefix, fullName, dateofbirth, gender, degree, major, majorgroup,
certificateno, certificateIssueDate, score, result, examAttribute, remark, isspecial,
applydate, university, position_name, hddPosition, typeTest, position_level, position_type,
exam_name, exam_order, score_year,
COUNT(*) OVER() AS total_count
FROM exam_info
WHERE disable_import_id = @id
");
cmd.Parameters.Clear();
cmd.Parameters.Add(p_Id);
var keywordParam = req.keyword?.Trim(); var keywordParam = req.keyword?.Trim();
if (!string.IsNullOrWhiteSpace(keywordParam)) if (!string.IsNullOrWhiteSpace(keywordParam))
{ {
sb.Append(@" query = query.Where(x =>
AND ( x.ExamId.Contains(keywordParam) ||
examID LIKE @kw x.CitizenId.Contains(keywordParam) ||
OR profileID LIKE @kw x.Prefix.Contains(keywordParam) ||
OR prefix LIKE @kw x.FirstName.Contains(keywordParam) ||
OR fullName LIKE @kw x.LastName.Contains(keywordParam) ||
OR hddPosition LIKE @kw x.HddPosition.Contains(keywordParam) ||
OR position_name LIKE @kw x.PositionName.Contains(keywordParam)
);
}
int total = await query.CountAsync();
query = query
.Skip((req.Page - 1) * req.PageSize)
.Take(req.PageSize);
var data = await query
.GroupJoin(
_context.DisableScores.Include(x => x.ScoreImport),
rc => new { rc.PeriodExam!.Id, rc.ExamId },
sc => new { Id = sc.ScoreImport!.PeriodExamId, sc.ExamId },
(disable, scores) => new { disable, scores }
) )
"); .SelectMany(
cmd.Parameters.Add(new MySqlParameter("@kw", $"%{keywordParam}%")); x => x.scores.DefaultIfEmpty(),
} (x, sr) => new
// ---------------------------
// Paging + Sorting
// ---------------------------
sb.Append(" ORDER BY examID ");
sb.Append(" LIMIT @PageSize OFFSET @Offset ");
cmd.Parameters.Add(new MySqlParameter("@PageSize", req.PageSize));
cmd.Parameters.Add(new MySqlParameter("@Offset", (req.Page - 1) * req.PageSize));
cmd.CommandText = sb.ToString();
_context.Database.OpenConnection();
// ---------------------------
// ดึงข้อมูล + total
// ---------------------------
using (var reader = cmd.ExecuteReader())
{ {
while (reader.Read()) examID = x.disable.ExamId,
{ profileID = x.disable.CitizenId,
if (total == 0) prefix = x.disable.Prefix,
total = Convert.ToInt32(reader["total_count"]); fullName = $"{x.disable.FirstName} {x.disable.LastName}",
dateOfBirth = x.disable.DateOfBirth != null && x.disable.DateOfBirth != DateTime.MinValue
data.Add(new ? x.disable.DateOfBirth.ToThaiShortDate()
{ : "",
examID = reader["examID"].ToString(), gender = x.disable.Gendor,
profileID = reader["profileID"].ToString(), degree = x.disable.Educations.Any() ? x.disable.Educations.First().Degree : "",
prefix = reader["prefix"].ToString(), major = x.disable.Educations.Any() ? x.disable.Educations.First().Major : "",
fullName = reader["fullName"].ToString(), certificateNo = x.disable.Certificates.Any()
dateOfBirth = reader["dateofbirth"] == DBNull.Value ? "" : Convert.ToDateTime(reader["dateofbirth"]).ToThaiShortDate(), ? x.disable.Certificates.First().CertificateNo ?? ""
gender = reader["gender"].ToString(), : "",
degree = reader["degree"].ToString(), certificateIssueDate = x.disable.Certificates.Any() && x.disable.Certificates.First().IssueDate != null && x.disable.Certificates.First().IssueDate != DateTime.MinValue
major = reader["major"].ToString(), ? x.disable.Certificates.First().IssueDate.ToThaiShortDate()
majorgroup = reader["majorgroup"].ToString(), : "",
certificateNo = reader["certificateno"].ToString(), examScore = sr == null ? 0.0 : sr.TotalScore,
certificateIssueDate = reader["certificateIssueDate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["certificateIssueDate"]).ToThaiShortDate(), examResult = sr == null ? "" : sr.ExamStatus,
ExamScore = reader["score"] == DBNull.Value ? 0 : Convert.ToDecimal(reader["score"]), examAttribute = x.disable.Certificates.Any() && x.disable.Certificates.First().IssueDate != null
ExamResult = reader["result"].ToString(), ? _disableService.CheckValidCertificate(x.disable.Certificates.First().IssueDate, 5)
ExamAttribute = reader["examAttribute"].ToString(), ? "มีคุณสมบัติ" : "ไม่มีคุณสมบัติ"
Remark = reader["remark"].ToString(), : "ไม่มีคุณสมบัติ",
IsSpecial = reader["isspecial"].ToString(), remark = x.disable.Remark,
applyDate = reader["applydate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["applydate"]).ToThaiShortDate(), isSpecial = x.disable.Isspecial == "Y" ? x.disable.Isspecial : "",
university = reader["university"].ToString(), applyDate = x.disable.ApplyDate != null && x.disable.ApplyDate != DateTime.MinValue
position_name = reader["position_name"].ToString(), ? x.disable.ApplyDate.ToThaiShortDate()
hddPosition = reader["hddPosition"].ToString(), : "",
typeTest = reader["typeTest"].ToString(), university = x.disable.Educations.Any() ? x.disable.Educations.First().University : "",
position_level = reader["position_level"].ToString(), position_name = x.disable.PositionName,
position_type = reader["position_type"].ToString(), hddPosition = x.disable.HddPosition ?? "",
exam_name = reader["exam_name"].ToString(), typeTest = x.disable.typeTest ?? "",
exam_order = reader["exam_order"].ToString(), position_level = x.disable.PositionLevel ?? "",
score_year = Convert.ToInt32(reader["score_year"]).ToThaiYear().ToString() position_type = x.disable.PositionType ?? "",
}); exam_name = x.disable.PeriodExam!.Name,
} exam_order = x.disable.PeriodExam != null && x.disable.PeriodExam.Round != null
} ? x.disable.PeriodExam.Round.ToString()
} : "",
score_year = x.disable.PeriodExam != null && x.disable.PeriodExam.Year != null
? (x.disable.PeriodExam.Year > 2500 ? x.disable.PeriodExam.Year : x.disable.PeriodExam.Year + 543).ToString()
: "",
})
.ToListAsync();
// --------------------------- // ---------------------------
// 3. ดึงสรุปคะแนน // 3. ดึงสรุปคะแนน