惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Cloudflare Blog
小众软件
小众软件
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tailwind CSS Blog
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
博客园 - 司徒正美
V
Visual Studio Blog
G
Google Developers Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
aimingoo的专栏
aimingoo的专栏
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
S
SegmentFault 最新的问题
T
The Blog of Author Tim Ferriss
D
Docker
Vercel News
Vercel News
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
爱范儿
爱范儿
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏

博客园 - 毛毛虫

[Maui] 轮子——插件式开发 [Maui] Windows部署 [Maui] 造轮子——LoggerSqlite [Maui] 造轮子——Exception处理 [Maui] 造轮子——MessageBox [Maui] 造轮子——前言、本地化 [C#] 日积月累 [C#] 扩展Enumerable,实现类似Sqlserver的窗口函数lag [Blazor] 学习随笔——呈现约定 [Blazor] 学习随笔——生命周期 [Blazor] 学习随笔——RZ10012警告的处理 [Blazor WebAssembly] 学习随笔——组件1.微信弹框(WXDialog) [Blazor WebAssembly] 学习随笔——身份验证 Asp.net Help ASP.NET Web 应用 Docker踩坑历程——续 [Net6]自己写个消息推送 Docker批处理笔记 Asp.net6.0 Swagger使用备忘 ASP.NET Web 应用 Docker踩坑历程
[.net10] 极简数据库对象关系映射
毛毛虫 · 2026-01-21 · via 博客园 - 毛毛虫

有时候不想使用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。