chore: 首次簽入 Thinkyu ASP.NET 專案
- 加入 Visual Studio / ASP.NET .gitignore - 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
This commit is contained in:
@@ -0,0 +1,528 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using Microsoft.Data.Sqlite;
|
||||
using 報到系統客戶端.Data.Models;
|
||||
|
||||
namespace 報到系統客戶端.Data.Repositories
|
||||
{
|
||||
/// <summary>
|
||||
/// SignUps 本地資料庫操作類別
|
||||
/// </summary>
|
||||
public class SignUpsRepository
|
||||
{
|
||||
private readonly DatabaseService _dbService;
|
||||
|
||||
public SignUpsRepository()
|
||||
{
|
||||
_dbService = DatabaseService.Instance;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 新增一筆 SignUps 資料
|
||||
/// </summary>
|
||||
public int Insert(LocalSignUpItem item)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = @"
|
||||
INSERT INTO SignUps
|
||||
(CourseID, SeqNo, Name, Mobile, QRCode, SignUpType, IDNumber, IDType, MealType, Email, LossJobTimes, Gender, AgreementStatus, CheckInTime, CheckOutTime, CreatedAt, UpdatedAt)
|
||||
VALUES (@CourseID, @SeqNo, @Name, @Mobile, @QRCode, @SignUpType, @IDNumber, @IDType, @MealType, @Email, @LossJobTimes, @Gender, @AgreementStatus, @CheckInTime, @CheckOutTime, @CreatedAt, @UpdatedAt)
|
||||
";
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@CourseID", item.CourseID);
|
||||
cmd.Parameters.AddWithValue("@SeqNo", item.SeqNo);
|
||||
cmd.Parameters.AddWithValue("@Name", item.Name ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@Mobile", item.Mobile ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@QRCode", item.QRCode ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@SignUpType", item.SignUpType ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@IDNumber", item.IDNumber ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@IDType", item.IDType ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@MealType", item.MealType ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@Email", item.Email ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@LossJobTimes", item.LossJobTimes.HasValue ? (object)item.LossJobTimes.Value : DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@Gender", item.Gender ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@AgreementStatus", item.AgreementStatus ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@CheckInTime", item.CheckInTime ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@CheckOutTime", item.CheckOutTime ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@CreatedAt", DateTime.Now);
|
||||
cmd.Parameters.AddWithValue("@UpdatedAt", DateTime.Now);
|
||||
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
// 取得新增資料的 ID
|
||||
using (SqliteCommand cmd = new SqliteCommand("SELECT last_insert_rowid()", conn))
|
||||
{
|
||||
return Convert.ToInt32(cmd.ExecuteScalar());
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"新增 SignUps 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新一筆 SignUps 資料
|
||||
/// </summary>
|
||||
public bool Update(LocalSignUpItem item)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = @"
|
||||
UPDATE SignUps SET
|
||||
CourseID = @CourseID,
|
||||
SeqNo = @SeqNo,
|
||||
Name = @Name,
|
||||
Mobile = @Mobile,
|
||||
QRCode = @QRCode,
|
||||
SignUpType = @SignUpType,
|
||||
IDNumber = @IDNumber,
|
||||
IDType = @IDType,
|
||||
MealType = @MealType,
|
||||
Email = @Email,
|
||||
LossJobTimes = @LossJobTimes,
|
||||
Gender = @Gender,
|
||||
AgreementStatus = @AgreementStatus,
|
||||
CheckInTime = @CheckInTime,
|
||||
CheckOutTime = @CheckOutTime,
|
||||
UpdatedAt = @UpdatedAt
|
||||
WHERE ID = @ID
|
||||
";
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@ID", item.ID);
|
||||
cmd.Parameters.AddWithValue("@CourseID", item.CourseID);
|
||||
cmd.Parameters.AddWithValue("@SeqNo", item.SeqNo);
|
||||
cmd.Parameters.AddWithValue("@Name", item.Name ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@Mobile", item.Mobile ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@QRCode", item.QRCode ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@SignUpType", item.SignUpType ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@IDNumber", item.IDNumber ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@IDType", item.IDType ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@MealType", item.MealType ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@Email", item.Email ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@LossJobTimes", item.LossJobTimes.HasValue ? (object)item.LossJobTimes.Value : DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@Gender", item.Gender ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@AgreementStatus", item.AgreementStatus ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@CheckInTime", item.CheckInTime ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@CheckOutTime", item.CheckOutTime ?? (object)DBNull.Value);
|
||||
cmd.Parameters.AddWithValue("@UpdatedAt", DateTime.Now);
|
||||
|
||||
return cmd.ExecuteNonQuery() > 0;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"更新 SignUps 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 刪除一筆 SignUps 資料
|
||||
/// </summary>
|
||||
public bool Delete(int id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = "DELETE FROM SignUps WHERE ID = @ID";
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@ID", id);
|
||||
return cmd.ExecuteNonQuery() > 0;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"刪除 SignUps 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查詢所有 SignUps 資料
|
||||
/// </summary>
|
||||
public List<LocalSignUpItem> GetAll()
|
||||
{
|
||||
return Query("SELECT * FROM SignUps ORDER BY CourseID DESC, ID ASC");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查詢單筆 SignUps 資料
|
||||
/// </summary>
|
||||
public LocalSignUpItem GetById(int id)
|
||||
{
|
||||
var result = Query($"SELECT * FROM SignUps WHERE ID = {id}");
|
||||
return result.Count > 0 ? result[0] : null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 透過 QRCode 查詢
|
||||
/// </summary>
|
||||
public LocalSignUpItem GetByQRCode(string qrCode)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = "SELECT * FROM SignUps WHERE QRCode = @QRCode LIMIT 1";
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@QRCode", qrCode);
|
||||
|
||||
using (SqliteDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
return ReadSignUpItem(reader);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"按 QRCode 查詢失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按課程和姓名手機查詢
|
||||
/// </summary>
|
||||
public LocalSignUpItem GetByCourseNameMobile(int courseID, string name, string mobile)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = "SELECT * FROM SignUps WHERE CourseID = @CourseID";
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand())
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@CourseID", courseID);
|
||||
if (!string.IsNullOrEmpty(name))
|
||||
{
|
||||
sql += " AND Name = @Name";
|
||||
cmd.Parameters.AddWithValue("@Name", name);
|
||||
}
|
||||
if (!string.IsNullOrEmpty(mobile))
|
||||
{
|
||||
sql += " AND Mobile = @Mobile";
|
||||
cmd.Parameters.AddWithValue("@Mobile", mobile);
|
||||
}
|
||||
sql += " LIMIT 1";
|
||||
|
||||
cmd.Connection = conn;
|
||||
cmd.CommandText = sql;
|
||||
|
||||
using (SqliteDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
return ReadSignUpItem(reader);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"按課程和姓名手機查詢失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 條件查詢 SignUps 資料(分頁)
|
||||
/// </summary>
|
||||
public List<LocalSignUpItem> GetByCondition(int pageIndex, int pageSize, int courseID = 0, string name = "", string mobile = "")
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = "SELECT * FROM SignUps WHERE 1=1";
|
||||
|
||||
if (courseID > 0)
|
||||
sql += " AND CourseID = @CourseID";
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(name))
|
||||
sql += " AND Name LIKE '%' || @Name || '%'";
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(mobile))
|
||||
sql += " AND Mobile LIKE '%' || @Mobile || '%'";
|
||||
|
||||
sql += " ORDER BY CourseID DESC, ID ASC LIMIT @PageSize OFFSET @Offset";
|
||||
|
||||
List<LocalSignUpItem> result = new List<LocalSignUpItem>();
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
if (courseID > 0)
|
||||
cmd.Parameters.AddWithValue("@CourseID", courseID);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(name))
|
||||
cmd.Parameters.AddWithValue("@Name", name);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(mobile))
|
||||
cmd.Parameters.AddWithValue("@Mobile", mobile);
|
||||
|
||||
cmd.Parameters.AddWithValue("@PageSize", pageSize);
|
||||
cmd.Parameters.AddWithValue("@Offset", (pageIndex - 1) * pageSize);
|
||||
|
||||
using (SqliteDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
result.Add(ReadSignUpItem(reader));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"查詢 SignUps 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查詢 SignUps 資料總數
|
||||
/// </summary>
|
||||
public int GetCount(int courseID = 0, string name = "", string mobile = "")
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = "SELECT COUNT(*) FROM SignUps WHERE 1=1";
|
||||
|
||||
if (courseID > 0)
|
||||
sql += " AND CourseID = @CourseID";
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(name))
|
||||
sql += " AND Name LIKE '%' || @Name || '%'";
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(mobile))
|
||||
sql += " AND Mobile LIKE '%' || @Mobile || '%'";
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
if (courseID > 0)
|
||||
cmd.Parameters.AddWithValue("@CourseID", courseID);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(name))
|
||||
cmd.Parameters.AddWithValue("@Name", name);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(mobile))
|
||||
cmd.Parameters.AddWithValue("@Mobile", mobile);
|
||||
|
||||
return Convert.ToInt32(cmd.ExecuteScalar());
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"統計 SignUps 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按課程 ID 查詢所有報名人員
|
||||
/// </summary>
|
||||
public List<LocalSignUpItem> GetByCourseID(int courseID)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = "SELECT * FROM SignUps WHERE CourseID = @CourseID ORDER BY ID ASC";
|
||||
|
||||
List<LocalSignUpItem> result = new List<LocalSignUpItem>();
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@CourseID", courseID);
|
||||
|
||||
using (SqliteDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
result.Add(ReadSignUpItem(reader));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"按課程 ID 查詢失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按序號查詢單筆記錄
|
||||
/// </summary>
|
||||
public LocalSignUpItem GetBySeqNo(int seqNo)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = "SELECT * FROM SignUps WHERE SeqNo = @SeqNo LIMIT 1";
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@SeqNo", seqNo);
|
||||
|
||||
using (SqliteDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
return ReadSignUpItem(reader);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"按序號查詢失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按活動編號和序號查詢單筆記錄
|
||||
/// </summary>
|
||||
public LocalSignUpItem GetByCourseIDAndSeqNo(int courseID, int seqNo)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
string sql = "SELECT * FROM SignUps WHERE CourseID = @CourseID AND SeqNo = @SeqNo LIMIT 1";
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@CourseID", courseID);
|
||||
cmd.Parameters.AddWithValue("@SeqNo", seqNo);
|
||||
|
||||
using (SqliteDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
if (reader.Read())
|
||||
{
|
||||
return ReadSignUpItem(reader);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"按課程編號和序號查詢失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清除所有 SignUps 資料
|
||||
/// </summary>
|
||||
public void DeleteByCourseID(int courseID)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
using (SqliteCommand cmd = new SqliteCommand("DELETE FROM SignUps WHERE CourseID = @CourseID", conn))
|
||||
{
|
||||
cmd.Parameters.AddWithValue("@CourseID", courseID);
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"清除 SignUps 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清除所有 SignUps 資料
|
||||
/// </summary>
|
||||
public void DeleteAll()
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
using (SqliteCommand cmd = new SqliteCommand("DELETE FROM SignUps", conn))
|
||||
{
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"清除 SignUps 資料失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 私用方法 - 執行查詢
|
||||
/// </summary>
|
||||
private List<LocalSignUpItem> Query(string sql)
|
||||
{
|
||||
try
|
||||
{
|
||||
var conn = _dbService.GetConnection();
|
||||
List<LocalSignUpItem> result = new List<LocalSignUpItem>();
|
||||
|
||||
using (SqliteCommand cmd = new SqliteCommand(sql, conn))
|
||||
{
|
||||
using (SqliteDataReader reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (reader.Read())
|
||||
{
|
||||
result.Add(ReadSignUpItem(reader));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception($"查詢 SignUps 失敗:{ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 私用方法 - 讀取資料列
|
||||
/// </summary>
|
||||
private LocalSignUpItem ReadSignUpItem(SqliteDataReader reader)
|
||||
{
|
||||
return new LocalSignUpItem
|
||||
{
|
||||
ID = reader.GetInt32(reader.GetOrdinal("ID")),
|
||||
CourseID = reader.GetInt32(reader.GetOrdinal("CourseID")),
|
||||
SeqNo = reader.IsDBNull(reader.GetOrdinal("SeqNo")) ? 0 : reader.GetInt32(reader.GetOrdinal("SeqNo")),
|
||||
Name = reader.IsDBNull(reader.GetOrdinal("Name")) ? null : reader.GetString(reader.GetOrdinal("Name")),
|
||||
Mobile = reader.IsDBNull(reader.GetOrdinal("Mobile")) ? null : reader.GetString(reader.GetOrdinal("Mobile")),
|
||||
QRCode = reader.IsDBNull(reader.GetOrdinal("QRCode")) ? null : reader.GetString(reader.GetOrdinal("QRCode")),
|
||||
SignUpType = reader.IsDBNull(reader.GetOrdinal("SignUpType")) ? null : reader.GetString(reader.GetOrdinal("SignUpType")),
|
||||
IDNumber = reader.IsDBNull(reader.GetOrdinal("IDNumber")) ? null : reader.GetString(reader.GetOrdinal("IDNumber")),
|
||||
IDType = reader.IsDBNull(reader.GetOrdinal("IDType")) ? null : reader.GetString(reader.GetOrdinal("IDType")),
|
||||
MealType = reader.IsDBNull(reader.GetOrdinal("MealType")) ? null : reader.GetString(reader.GetOrdinal("MealType")),
|
||||
Email = reader.IsDBNull(reader.GetOrdinal("Email")) ? null : reader.GetString(reader.GetOrdinal("Email")),
|
||||
LossJobTimes = reader.IsDBNull(reader.GetOrdinal("LossJobTimes")) ? null : (int?)reader.GetInt32(reader.GetOrdinal("LossJobTimes")),
|
||||
Gender = reader.IsDBNull(reader.GetOrdinal("Gender")) ? null : reader.GetString(reader.GetOrdinal("Gender")),
|
||||
AgreementStatus = reader.IsDBNull(reader.GetOrdinal("AgreementStatus")) ? null : reader.GetString(reader.GetOrdinal("AgreementStatus")),
|
||||
CheckInTime = reader.IsDBNull(reader.GetOrdinal("CheckInTime")) ? null : reader.GetString(reader.GetOrdinal("CheckInTime")),
|
||||
CheckOutTime = reader.IsDBNull(reader.GetOrdinal("CheckOutTime")) ? null : reader.GetString(reader.GetOrdinal("CheckOutTime")),
|
||||
CreatedAt = reader.GetDateTime(reader.GetOrdinal("CreatedAt")),
|
||||
UpdatedAt = reader.GetDateTime(reader.GetOrdinal("UpdatedAt"))
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user