有時候不想使用EF等ORM框架,想要實現的功能也簡單,就是獲取一條或者多條記錄,於是自己折騰了一個,代碼如下:
public class SqlFetch
{
private readonly string _ConnectionString;
/// <summary>
/// 獲取數據庫連接字符串
/// </summary>
/// <param name="config"></param>
public SqlFetch(IConfiguration config)
{
_ConnectionString = config.GetSection(SectionConsts.ConnectionString).Get<string>()!;
}
/// <summary>
/// 獲取多條記錄
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="commandText"></param>
/// <param name="func"></param>
/// <returns></returns>
public Task<List<T>> ToListAsync<T>(string commandText, Func<IDataReader, T> func) => ToListAsync(commandText, [], func);
/// <summary>
/// 獲取多條記錄,帶參數
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="commandText"></param>
/// <param name="paras"></param>
/// <param name="func"></param>
/// <returns></returns>
public async Task<List<T>> ToListAsync<T>(string commandText, List<SqlParameter> paras, Func<IDataReader, T> func)
{
var items = new List<T>();
var cn = new SqlConnection(_ConnectionString);
var cmd = cn.CreateCommand();
cmd.CommandText = commandText;
if (paras.Count > 0)
cmd.Parameters.AddRange(paras.ToArray());
await cn.OpenAsync();
var dr = await cmd.ExecuteReaderAsync();
while (await dr.ReadAsync())
items.Add(func(dr));
await dr.CloseAsync();
await cn.CloseAsync();
return items;
}
/// <summary>
/// 獲取單條記錄
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="commandText"></param>
/// <param name="func"></param>
/// <returns></returns>
public async Task<T?> SingleOrDefaultAsync<T>(string commandText, Func<IDataReader, T> func)
{
var cn = new SqlConnection(_ConnectionString);
var cmd = cn.CreateCommand();
cmd.CommandText = commandText;
await cn.OpenAsync();
var dr = await cmd.ExecuteReaderAsync();
try
{
if (await dr.ReadAsync())
return func(dr);
else
return default;
}
finally
{
await dr.CloseAsync();
await cn.CloseAsync();
}
}
}
頁面調用
public async Task OnGet([FromServices] SqlFetch sqlFetch)
{
List<ViewModelTest> items = await sqlFetch.ToListAsync("select int1,nvarchar2 from databasename..tablename where whereCause",
dr => new ViewModelTest(dr.GetInt32(0), dr.GetString(1)));
}
不知道算不算ORM。
不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。
不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。不知道算不算ORM。