DotNet相关
WebAPI 项目通过 CI/CD 自动化部署到 Linux 服务器(docker-compose)
独孤求败 发表于2026-02-11 浏览38 评论0
DotNet相关
笔记:如何使用 Entity Framework Core
独孤求败 发表于2026-01-25 浏览68 评论0
前言#
在本篇文章中,着重介绍如何使用 Entity Framework Core,不过多涉及底层细节。
Entity Framework Core(简称 EF Core)是微软为.NET 平台打造的轻量级、跨平台对象关系映射(ORM)框架,以编写 C# 对象代码的方式操作各类数据库,无需大量手写原生 SQL 语句。
DotNet相关
DotNet10极简数据库对象关系映射
独孤求败 发表于2026-01-25 浏览54 评论0
有时候不想使用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();
}
}
}DotNet相关
Visual Studio 2026 来了:更快、更智能,深受老用户的喜爱
独孤求败 发表于2026-01-24 浏览52 评论0
我们非常激动地宣布,Visual Studio 2026 现已正式发布!这一刻是我们与您携手共创的成果。您的反馈对本次版本的塑造作用超过了以往任何一次。自 2025 年 9 月推出 Insiders 通道以来,下载并测试该预览版的开发者数量创下了 Visual Studio 历史新高。
在此次版本发布前的一年里,我们修复了超过 5000 个你们反馈的程序缺陷,并实现了300项功能需求。这是我们有史以来完成量最多的一次,而我们才刚刚开始!
此次发布包含多项性能改进、重新设计的用户体验以及人工智能驱动开发方面的重大飞跃,旨在帮助开发者专注于真正重要的事情:创新。如今,每一次点击、每一次按键和每一次编译都更加流畅、快速且直观 —— 让您能够以前所未有的速度将想法转化为代码。
DotNet相关
.NET 10了,HttpClient还是不能用using吗?我做了一个实验
独孤求败 发表于2026-01-24 浏览64 评论0
引言:这个“最佳实践”到底过时了吗?
每隔一段时间,就会看到类似问题反复出现:
“都 .NET 10 了,
HttpClient还不能using吗?我每次请求new HttpClient(),用完Dispose(),不是很合理?”
这类问题之所以经久不衰,是因为它
DotNet相关
如何使用EFcore查询a表中符合b表列的值
独孤求败 发表于2026-01-23 浏览46 评论0
在Entity Framework Core (EF Core) 中,如果你想要查询表A中那些其某些列的值与表B中某一列的值相匹配的记录,你可以使用多种方法来实现这一需求。这里我将介绍几种常用的方法:
方法1:使用 Contains
假设你有两个实体类 A 和 B,你想要找到所有在表A中,其某个字段(例如 FieldA)的值在表B的某个字段(例如 FieldB)中存在的记录。
DotNet相关
.NET实现多任务异步与并行处理的详细步骤
独孤求败 发表于2026-01-23 浏览54 评论0
在现代软件开发中,高效处理多个任务是一个常见需求。无论是数据处理、网络请求还是计算密集型操作,合理地利用多核CPU的并行处理能力可以显著提升程序性能。.NET平台提供了丰富的内置工具来实现多任务并行处理,无需依赖第三方库。本文将深入探讨如何使用.NET标准库实现高效的多任务并行处理。
核心概念解释
1. 并行与并发的区别
并行(Parallel)是指多个任务真正同时执行,需要多核CPU支持;而并发(Concurrent)是指多个任务交替执行,给人同时执行的错觉。
DotNet相关
ASP.NET Core中创建中间件的几种方式
独孤求败 发表于2026-01-23 浏览48 评论0
中间件介绍
ASP.NET Core中间件(Middleware)是用于处理HTTP请求和响应的组件,它们被安排在请求处理管道中,并按顺序执行。中间件的设计是为了使其在请求处理管道中能够以灵活和可扩展的方式处理 HTTP 请求和响应。
下图显示了 ASP.NET Core MVC 和 Razor Pages 应用的完整请求处理管道:
了解现有中间件的顺序,以及在哪里添加自定义中间件。你可以完全控制如何重新排列现有中间件,或根据场景需要注入新的自定义中间件。
DotNet相关
.NET异步编程中内存泄漏的终极解决方案
独孤求败 发表于2026-01-23 浏览46 评论0
DotNet相关
使用.NET8实现一个完整的串口通讯工具类
独孤求败 发表于2026-01-23 浏览43 评论0
(Serial Communication)在工业控制、物联网设备、嵌入式系统和自动化领域仍然广泛应用。.NET 8 提供了强大的 System.IO.Ports命名空间,使得实现串口通信变得简单高效。本文将详细介绍如何使用 .NET 8 实现一个功能完整的串口通信工具类,包含配置管理、数据收发、事件处理和错误处理等功能。
1. 串口通信工具类设计
首先,我们设计一个 SerialPortTool类,封装所有串口操作: