Merge pull request #4 from Frappet/issue/#1833

raw query to EF query #1833
This commit is contained in:
Harid Promsri 2025-10-09 14:02:53 +07:00 committed by GitHub
commit 0c8b88c304
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1959,102 +1959,86 @@ namespace BMA.EHR.Recruit.Service.Controllers
{ {
try try
{ {
var data = new List<dynamic>(); var query = _context.Recruits
var p_Id = new MySqlParameter("@id", id); .Include(x => x.RecruitImport)
int total = 0; .Include(x => x.Educations)
.Include(x => x.Certificates)
// --------------------------- .OrderBy(x => x.ExamId)
// 1. ดึงรายละเอียดสอบ (exam_info) .Where(x => x.RecruitImport != null && x.RecruitImport.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 recruit_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.RecruitScores.Include(x => x.ScoreImport),
rc => new { rc.RecruitImport!.Id, rc.ExamId },
sc => new { Id = sc.ScoreImport!.RecruitImportId, sc.ExamId },
(recruit, scores) => new { recruit, 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.recruit.ExamId,
{ profileID = x.recruit.CitizenId,
if (total == 0) prefix = x.recruit.Prefix,
total = Convert.ToInt32(reader["total_count"]); fullName = $"{x.recruit.FirstName} {x.recruit.LastName}",
dateOfBirth = x.recruit.DateOfBirth != null && x.recruit.DateOfBirth != DateTime.MinValue
data.Add(new ? x.recruit.DateOfBirth.ToThaiShortDate()
{ : "",
examID = reader["examID"].ToString(), gender = x.recruit.Gendor,
profileID = reader["profileID"].ToString(), degree = x.recruit.Educations.Any() ? x.recruit.Educations.First().Degree : "",
prefix = reader["prefix"].ToString(), major = x.recruit.Educations.Any() ? x.recruit.Educations.First().Major : "",
fullName = reader["fullName"].ToString(), certificateNo = x.recruit.Certificates.Any()
dateOfBirth = reader["dateofbirth"] == DBNull.Value ? "" : Convert.ToDateTime(reader["dateofbirth"]).ToThaiShortDate(), ? x.recruit.Certificates.First().CertificateNo ?? ""
gender = reader["gender"].ToString(), : "",
degree = reader["degree"].ToString(), certificateIssueDate = x.recruit.Certificates.Any() && x.recruit.Certificates.First().IssueDate != null && x.recruit.Certificates.First().IssueDate != DateTime.MinValue
major = reader["major"].ToString(), ? x.recruit.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.recruit.Certificates.Any() && x.recruit.Certificates.First().IssueDate != null
ExamResult = reader["result"].ToString(), ? _recruitService.CheckValidCertificate(x.recruit.Certificates.First().IssueDate, 5)
ExamAttribute = reader["examAttribute"].ToString(), ? "มีคุณสมบัติ" : "ไม่มีคุณสมบัติ"
Remark = reader["remark"].ToString(), : "ไม่มีคุณสมบัติ",
IsSpecial = reader["isspecial"].ToString(), remark = x.recruit.Remark,
applyDate = reader["applydate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["applydate"]).ToThaiShortDate(), isSpecial = x.recruit.Isspecial == "Y" ? x.recruit.Isspecial : "",
university = reader["university"].ToString(), applyDate = x.recruit.ApplyDate != null && x.recruit.ApplyDate != DateTime.MinValue
position_name = reader["position_name"].ToString(), ? x.recruit.ApplyDate.ToThaiShortDate()
hddPosition = reader["hddPosition"].ToString(), : "",
typeTest = reader["typeTest"].ToString(), university = x.recruit.Educations.Any() ? x.recruit.Educations.First().University : "",
position_level = reader["position_level"].ToString(), position_name = x.recruit.PositionName,
position_type = reader["position_type"].ToString(), hddPosition = x.recruit.HddPosition,
exam_name = reader["exam_name"].ToString(), typeTest = x.recruit.typeTest,
exam_order = reader["exam_order"].ToString(), position_level = x.recruit.PositionLevel,
score_year = Convert.ToInt32(reader["score_year"]).ToThaiYear().ToString() position_type = x.recruit.PositionType,
}); exam_name = x.recruit.RecruitImport!.Name,
} exam_order = x.recruit.RecruitImport != null && x.recruit.RecruitImport.Order != null
} ? x.recruit.RecruitImport.Order.ToString()
} : "",
score_year = x.recruit.RecruitImport != null && x.recruit.RecruitImport.Year != null
? x.recruit.RecruitImport.Year.ToThaiYear().ToString()
: "",
})
.ToListAsync();
// --------------------------- // ---------------------------
// 3. ดึงสรุปคะแนน // 3. ดึงสรุปคะแนน