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,103 +2013,87 @@ namespace BMA.EHR.Recurit.Exam.Service.Controllers
if (periodExam == null)
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
var data = new List<dynamic>();
var p_Id = new MySqlParameter("@id", id);
int total = 0;
var query = _context.Disables
.Include(x => x.PeriodExam)
.Include(x => x.Educations)
.Include(x => x.Certificates)
.OrderBy(x => x.ExamId)
.Where(x => x.PeriodExam != null && x.PeriodExam.Id == id);
// ---------------------------
// 1. ดึงรายละเอียดสอบ (exam_info)
// ---------------------------
using (var cmd = _context.Database.GetDbConnection().CreateCommand())
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 disable_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.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(
x => x.scores.DefaultIfEmpty(),
(x, sr) => new
{
examID = x.disable.ExamId,
profileID = x.disable.CitizenId,
prefix = x.disable.Prefix,
fullName = $"{x.disable.FirstName} {x.disable.LastName}",
dateOfBirth = x.disable.DateOfBirth != null && x.disable.DateOfBirth != DateTime.MinValue
? x.disable.DateOfBirth.ToThaiShortDate()
: "",
gender = x.disable.Gendor,
degree = x.disable.Educations.Any() ? x.disable.Educations.First().Degree : "",
major = x.disable.Educations.Any() ? x.disable.Educations.First().Major : "",
certificateNo = x.disable.Certificates.Any()
? x.disable.Certificates.First().CertificateNo ?? ""
: "",
certificateIssueDate = x.disable.Certificates.Any() && x.disable.Certificates.First().IssueDate != null && x.disable.Certificates.First().IssueDate != DateTime.MinValue
? x.disable.Certificates.First().IssueDate.ToThaiShortDate()
: "",
examScore = sr == null ? 0.0 : sr.TotalScore,
examResult = sr == null ? "" : sr.ExamStatus,
examAttribute = x.disable.Certificates.Any() && x.disable.Certificates.First().IssueDate != null
? _disableService.CheckValidCertificate(x.disable.Certificates.First().IssueDate, 5)
? "มีคุณสมบัติ" : "ไม่มีคุณสมบัติ"
: "ไม่มีคุณสมบัติ",
remark = x.disable.Remark,
isSpecial = x.disable.Isspecial == "Y" ? x.disable.Isspecial : "",
applyDate = x.disable.ApplyDate != null && x.disable.ApplyDate != DateTime.MinValue
? x.disable.ApplyDate.ToThaiShortDate()
: "",
university = x.disable.Educations.Any() ? x.disable.Educations.First().University : "",
position_name = x.disable.PositionName,
hddPosition = x.disable.HddPosition ?? "",
typeTest = x.disable.typeTest ?? "",
position_level = x.disable.PositionLevel ?? "",
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. ดึงสรุปคะแนน
// ---------------------------