From f1a495de6a34882c8dd389a385daf417add42a8f Mon Sep 17 00:00:00 2001 From: harid Date: Wed, 8 Oct 2025 21:07:25 +0700 Subject: [PATCH 1/2] raw query to EF query #1833 --- Controllers/RecruitController.cs | 267 ++++++++++++++++++++----------- 1 file changed, 174 insertions(+), 93 deletions(-) diff --git a/Controllers/RecruitController.cs b/Controllers/RecruitController.cs index 31b22e2..9005a5a 100644 --- a/Controllers/RecruitController.cs +++ b/Controllers/RecruitController.cs @@ -1959,103 +1959,184 @@ namespace BMA.EHR.Recruit.Service.Controllers { try { - var data = new List(); - var p_Id = new MySqlParameter("@id", id); - int total = 0; + //var data = new List(); + //var p_Id = new MySqlParameter("@id", id); + //int total = 0; - // --------------------------- - // 1️. ดึงรายละเอียดสอบ (exam_info) - // --------------------------- - using (var cmd = _context.Database.GetDbConnection().CreateCommand()) + //// --------------------------- + //// 1️. ดึงรายละเอียดสอบ (exam_info) + //// --------------------------- + //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(); + // if (!string.IsNullOrWhiteSpace(keywordParam)) + // { + // sb.Append(@" + // AND ( + // examID LIKE @kw + // OR profileID LIKE @kw + // OR prefix LIKE @kw + // OR fullName LIKE @kw + // OR hddPosition LIKE @kw + // OR position_name LIKE @kw + // ) + // "); + // cmd.Parameters.Add(new MySqlParameter("@kw", $"%{keywordParam}%")); + // } + + // // --------------------------- + // // 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()) + // { + // if (total == 0) + // total = Convert.ToInt32(reader["total_count"]); + + // data.Add(new + // { + // examID = reader["examID"].ToString(), + // profileID = reader["profileID"].ToString(), + // prefix = reader["prefix"].ToString(), + // fullName = reader["fullName"].ToString(), + // dateOfBirth = reader["dateofbirth"] == DBNull.Value ? "" : Convert.ToDateTime(reader["dateofbirth"]).ToThaiShortDate(), + // gender = reader["gender"].ToString(), + // degree = reader["degree"].ToString(), + // major = reader["major"].ToString(), + // majorgroup = reader["majorgroup"].ToString(), + // certificateNo = reader["certificateno"].ToString(), + // certificateIssueDate = reader["certificateIssueDate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["certificateIssueDate"]).ToThaiShortDate(), + // ExamScore = reader["score"] == DBNull.Value ? 0 : Convert.ToDecimal(reader["score"]), + // ExamResult = reader["result"].ToString(), + // ExamAttribute = reader["examAttribute"].ToString(), + // Remark = reader["remark"].ToString(), + // IsSpecial = reader["isspecial"].ToString(), + // applyDate = reader["applydate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["applydate"]).ToThaiShortDate(), + // university = reader["university"].ToString(), + // position_name = reader["position_name"].ToString(), + // hddPosition = reader["hddPosition"].ToString(), + // typeTest = reader["typeTest"].ToString(), + // position_level = reader["position_level"].ToString(), + // position_type = reader["position_type"].ToString(), + // exam_name = reader["exam_name"].ToString(), + // exam_order = reader["exam_order"].ToString(), + // score_year = Convert.ToInt32(reader["score_year"]).ToThaiYear().ToString() + // }); + // } + // } + //} + + var query = _context.Recruits + .Include(x => x.RecruitImport) + .Include(x => x.Educations) + .Include(x => x.Certificates) + .OrderBy(x => x.ExamId) + .Where(x => x.RecruitImport != null && x.RecruitImport.Id == id); + + var keywordParam = req.keyword?.Trim(); + if (!string.IsNullOrWhiteSpace(keywordParam)) { - 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(); - if (!string.IsNullOrWhiteSpace(keywordParam)) - { - sb.Append(@" - AND ( - examID LIKE @kw - OR profileID LIKE @kw - OR prefix LIKE @kw - OR fullName LIKE @kw - OR hddPosition LIKE @kw - OR position_name LIKE @kw - ) - "); - cmd.Parameters.Add(new MySqlParameter("@kw", $"%{keywordParam}%")); - } - - // --------------------------- - // 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()) - { - if (total == 0) - total = Convert.ToInt32(reader["total_count"]); - - data.Add(new - { - examID = reader["examID"].ToString(), - profileID = reader["profileID"].ToString(), - prefix = reader["prefix"].ToString(), - fullName = reader["fullName"].ToString(), - dateOfBirth = reader["dateofbirth"] == DBNull.Value ? "" : Convert.ToDateTime(reader["dateofbirth"]).ToThaiShortDate(), - gender = reader["gender"].ToString(), - degree = reader["degree"].ToString(), - major = reader["major"].ToString(), - majorgroup = reader["majorgroup"].ToString(), - certificateNo = reader["certificateno"].ToString(), - certificateIssueDate = reader["certificateIssueDate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["certificateIssueDate"]).ToThaiShortDate(), - ExamScore = reader["score"] == DBNull.Value ? 0 : Convert.ToDecimal(reader["score"]), - ExamResult = reader["result"].ToString(), - ExamAttribute = reader["examAttribute"].ToString(), - Remark = reader["remark"].ToString(), - IsSpecial = reader["isspecial"].ToString(), - applyDate = reader["applydate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["applydate"]).ToThaiShortDate(), - university = reader["university"].ToString(), - position_name = reader["position_name"].ToString(), - hddPosition = reader["hddPosition"].ToString(), - typeTest = reader["typeTest"].ToString(), - position_level = reader["position_level"].ToString(), - position_type = reader["position_type"].ToString(), - exam_name = reader["exam_name"].ToString(), - exam_order = reader["exam_order"].ToString(), - score_year = Convert.ToInt32(reader["score_year"]).ToThaiYear().ToString() - }); - } - } + query = query.Where(x => + x.ExamId.Contains(keywordParam) || + x.CitizenId.Contains(keywordParam) || + x.Prefix.Contains(keywordParam) || + x.FirstName.Contains(keywordParam) || + x.LastName.Contains(keywordParam) || + x.HddPosition.Contains(keywordParam) || + 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( + x => x.scores.DefaultIfEmpty(), + (x, sr) => new + { + examID = x.recruit.ExamId, + profileID = x.recruit.CitizenId, + prefix = x.recruit.Prefix, + fullName = $"{x.recruit.FirstName} {x.recruit.LastName}", + dateOfBirth = x.recruit.DateOfBirth != null && x.recruit.DateOfBirth != DateTime.MinValue + ? x.recruit.DateOfBirth.ToThaiShortDate() + : "", + gender = x.recruit.Gendor, + degree = x.recruit.Educations.Any() ? x.recruit.Educations.First().Degree : "", + major = x.recruit.Educations.Any() ? x.recruit.Educations.First().Major : "", + certificateNo = x.recruit.Certificates.Any() + ? x.recruit.Certificates.First().CertificateNo ?? "" + : "", + certificateIssueDate = x.recruit.Certificates.Any() && x.recruit.Certificates.First().IssueDate != null && x.recruit.Certificates.First().IssueDate != DateTime.MinValue + ? x.recruit.Certificates.First().IssueDate.ToThaiShortDate() + : "", + examScore = sr == null ? 0.0 : sr.TotalScore, + examResult = sr == null ? "" : sr.ExamStatus, + examAttribute = x.recruit.Certificates.Any() && x.recruit.Certificates.First().IssueDate != null + ? _recruitService.CheckValidCertificate(x.recruit.Certificates.First().IssueDate, 5) + ? "มีคุณสมบัติ" : "ไม่มีคุณสมบัติ" + : "ไม่มีคุณสมบัติ", + remark = x.recruit.Remark, + isSpecial = x.recruit.Isspecial == "Y" ? x.recruit.Isspecial : "", + applyDate = x.recruit.ApplyDate != null && x.recruit.ApplyDate != DateTime.MinValue + ? x.recruit.ApplyDate.ToThaiShortDate() + : "", + university = x.recruit.Educations.Any() ? x.recruit.Educations.First().University : "", + position_name = x.recruit.PositionName, + hddPosition = x.recruit.HddPosition, + typeTest = x.recruit.typeTest, + position_level = x.recruit.PositionLevel, + 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️. ดึงสรุปคะแนน // --------------------------- From ea54763fb61a1c64177b6d8c97c2f30956a48b98 Mon Sep 17 00:00:00 2001 From: harid Date: Thu, 9 Oct 2025 10:25:59 +0700 Subject: [PATCH 2/2] comment --- Controllers/RecruitController.cs | 101 +------------------------------ 1 file changed, 2 insertions(+), 99 deletions(-) diff --git a/Controllers/RecruitController.cs b/Controllers/RecruitController.cs index 9005a5a..728c5b4 100644 --- a/Controllers/RecruitController.cs +++ b/Controllers/RecruitController.cs @@ -1959,103 +1959,6 @@ namespace BMA.EHR.Recruit.Service.Controllers { try { - //var data = new List(); - //var p_Id = new MySqlParameter("@id", id); - //int total = 0; - - //// --------------------------- - //// 1️. ดึงรายละเอียดสอบ (exam_info) - //// --------------------------- - //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(); - // if (!string.IsNullOrWhiteSpace(keywordParam)) - // { - // sb.Append(@" - // AND ( - // examID LIKE @kw - // OR profileID LIKE @kw - // OR prefix LIKE @kw - // OR fullName LIKE @kw - // OR hddPosition LIKE @kw - // OR position_name LIKE @kw - // ) - // "); - // cmd.Parameters.Add(new MySqlParameter("@kw", $"%{keywordParam}%")); - // } - - // // --------------------------- - // // 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()) - // { - // if (total == 0) - // total = Convert.ToInt32(reader["total_count"]); - - // data.Add(new - // { - // examID = reader["examID"].ToString(), - // profileID = reader["profileID"].ToString(), - // prefix = reader["prefix"].ToString(), - // fullName = reader["fullName"].ToString(), - // dateOfBirth = reader["dateofbirth"] == DBNull.Value ? "" : Convert.ToDateTime(reader["dateofbirth"]).ToThaiShortDate(), - // gender = reader["gender"].ToString(), - // degree = reader["degree"].ToString(), - // major = reader["major"].ToString(), - // majorgroup = reader["majorgroup"].ToString(), - // certificateNo = reader["certificateno"].ToString(), - // certificateIssueDate = reader["certificateIssueDate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["certificateIssueDate"]).ToThaiShortDate(), - // ExamScore = reader["score"] == DBNull.Value ? 0 : Convert.ToDecimal(reader["score"]), - // ExamResult = reader["result"].ToString(), - // ExamAttribute = reader["examAttribute"].ToString(), - // Remark = reader["remark"].ToString(), - // IsSpecial = reader["isspecial"].ToString(), - // applyDate = reader["applydate"] == DBNull.Value ? "" : Convert.ToDateTime(reader["applydate"]).ToThaiShortDate(), - // university = reader["university"].ToString(), - // position_name = reader["position_name"].ToString(), - // hddPosition = reader["hddPosition"].ToString(), - // typeTest = reader["typeTest"].ToString(), - // position_level = reader["position_level"].ToString(), - // position_type = reader["position_type"].ToString(), - // exam_name = reader["exam_name"].ToString(), - // exam_order = reader["exam_order"].ToString(), - // score_year = Convert.ToInt32(reader["score_year"]).ToThaiYear().ToString() - // }); - // } - // } - //} - var query = _context.Recruits .Include(x => x.RecruitImport) .Include(x => x.Educations) @@ -2128,8 +2031,8 @@ namespace BMA.EHR.Recruit.Service.Controllers position_level = x.recruit.PositionLevel, 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() + 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()