C# SQLSugar、HiSql、FreeSql ORM框架全面性能测试对比 SQL Server 性能测试 .NET

108 篇文章 ¥59.90 ¥99.00
本文对C#中的SQLSugar、HiSql和FreeSql三个ORM框架进行了全面的性能测试对比,重点在于SQL Server环境下的查询、插入和更新速度。测试结果显示,SQLSugar在查询速度上表现出色,HiSql紧随其后,而FreeSql虽然较慢,但仍能满足多数应用需求。在选择ORM框架时,应综合考虑性能、易用性、功能和社区支持等因素。

在开发.NET应用程序时,选择一个高性能的ORM(对象关系映射)框架对于提高数据库操作效率至关重要。在本文中,我们将对C#中的三个主流ORM框架进行全方位的性能测试对比:SQLSugar、HiSql和FreeSql。这些框架都支持SQL Server数据库,并且适用于.NET平台。

我们将通过一系列基准测试和性能指标来评估每个ORM框架的性能,包括查询速度、插入速度和更新速度。这些测试将在相同的硬件环境下进行,并使用相同的测试数据集。下面是我们的测试代码:

using System;
using System.Diagnostics;
using SqlSugar;

public class 
<think>我们被要求不使用实体类来实现增删改查。FreeSql通常推荐使用实体类,但也提供了一些动态对象操作的方式。根据引用[1]中提到的FreeSql文档,我们可以使用FreeSql的Insert、Update、Delete和Select方法,通过传入匿名对象或字典来实现动态操作。但是,需要注意的是,FreeSql的动态操作支持有限,尤其是对于更新和删除操作,通常需要条件,而查询则需要指定返回的类型(可以是动态类型)。以下是不使用实体类进行增删改查的方法:1.插入数据(Insert):我们可以使用`fsql.Insert<object>()`并指定表名,然后插入一个匿名对象或字典。2.更新数据(Update):使用`fsql.Update<object>()`指定表名,然后设置更新字段和条件。3.删除数据(Delete):使用`fsql.Delete<object>()`指定表名,然后添加条件。4.查询数据(Select):使用`fsql.Select<object>()`指定表名,然后可以查询,返回动态类型的列表(如`List<dynamic>`)或单个动态对象。但是,由于FreeSql的泛型方法需要类型参数,我们使用`object`作为泛型类型,然后通过`AsTable`方法指定表名。注意:FreeSql的版本更新可能会有所不同,以下示例基于FreeSql的基本用法。下面我们分别给出示例代码:**插入数据示例:**```csharp//插入单条数据,使用匿名对象varaffrows=fsql.Insert<object>().AsTable("table_name")//指定表名.AppendData(new{name="test",create_time=DateTime.Now})//匿名对象.ExecuteAffrows();//或者使用字典Dictionary<string,object>dic=newDictionary<string,object>();dic.Add("name","test");dic.Add("create_time",DateTime.Now);affrows=fsql.Insert<object>().AsTable("table_name").AppendData(dic).ExecuteAffrows();```**更新数据示例:**```csharp//更新数据,使用匿名对象或字典设置字段,使用Where条件varaffrows=fsql.Update<object>().AsTable("table_name").Set(new{name="new_name"})//更新字段.Where("id",1)//条件.ExecuteAffrows();//或者使用字典更新Dictionary<string,object>dic=newDictionary<string,object>();dic.Add("name","new_name");affrows=fsql.Update<object>().AsTable("table_name").Set(dic).Where("id",1).ExecuteAffrows();```**删除数据示例:**```csharp//删除数据varaffrows=fsql.Delete<object>().AsTable("table_name").Where("id",1).ExecuteAffrows();```**查询数据示例:**```csharp//查询所有数据varlist=fsql.Select<object>().AsTable("table_name").ToList();//返回List<object>,但实际每个元素是dynamic(在运行时是匿名类型或字典?)//注意:FreeSql的Select<object>返回的是List<object>,但我们可以转换为动态类型列表//实际上,FreeSql在查询时,如果没有指定实体类型,返回的是List<Dictionary<string,object>>?我们需要查看文档确认。//根据引用和FreeSql的文档,我们可以使用ToDataTable方法或者ToList<dynamic>,但Select<object>不支持直接返回dynamic。//另一种方式是使用FreeSqlSQL查询方法(直接执行SQL),这样可以更灵活地返回动态类型。//使用SQL查询:varlist=fsql.Ado.Query<dynamic>("select*fromtable_name");//或者使用Select方法返回DataTable(如果不想用SQL):DataTabledt=fsql.Select<object>().AsTable("table_name").ToDataTable();```但是,上述查询方法中,使用`Ado.Query<dynamic>`是最直接的方式,可以返回动态类型。因此,如果不使用实体类,我们更推荐使用`Ado`对象执行SQL语句来实现增删改查,这样更灵活。使用Ado的示例:**插入(Ado):**```csharpstringsql="INSERTINTOtable_name(name,create_time)VALUES(@name,@create_time)";varaffrows=fsql.Ado.ExecuteNonQuery(sql,new{name="test",create_time=DateTime.Now});```**更新(Ado):**```csharpstringsql="UPDATEtable_nameSETname=@nameWHEREid=@id";varaffrows=fsql.Ado.ExecuteNonQuery(sql,new{name="new_name",id=1});```**删除(Ado):**```csharpstringsql="DELETEFROMtable_nameWHEREid=@id";varaffrows=fsql.Ado.ExecuteNonQuery(sql,new{id=1});```**查询(Ado):**```csharpstringsql="SELECT*FROMtable_name";varlist=fsql.Ado.Query<dynamic>(sql);```使用Ado执行SQL语句的方式,可以完全不依赖实体类,并且更灵活。总结:如果不想使用实体类,推荐使用FreeSql的Ado对象执行原生SQL语句。这样我们可以直接写SQL语句,并通过参数化来防止注入,同时可以返回动态类型。注意:FreeSql的Ado.Query<dynamic>返回的是`List<dynamic>`,每个动态对象都有对应的属性(即列名)。因此,根据用户需求,我们给出两种方式:1.使用FreeSql提供的动态对象操作(Insert/Update/Delete/Select)但需要指定表名,并且查询部分可能受限(如Select<object>返回的是List<object>,但实际是List<Dictionary<string,object>>?在FreeSql中,这种动态查询的支持可能不如Ado方式)。2.使用Ado执行原生SQL(推荐)。由于用户要求不依赖实体类,且操作SQLServer,我们推荐使用Ado方式。最后,请注意:FreeSql的连接字符串配置中,需要指定DataType为SqlServer(引用[1]中示例是Sqlite,但用户使用SQLServer)。连接字符串配置示例:```csharpstaticIFreeSqlfsql=newFreeSqlBuilder().UseConnectionString(FreeSql.DataType.SqlServer,"连接字符串")//...其他配置.Build();```以上就是在C#中使用FreeSqlORM框架操作SQLServer数据库,不依赖实体类实现增删改查的方法。</think>在 C# 中使用 FreeSql ORM 操作 SQL Server 数据库而不依赖实体类,可以通过以下方式实现增删改查操作: ### 1. 插入数据(Create) ```csharp // 使用字典动态构建插入数据 var dict = new Dictionary<string, object> { { "Name", "张三" }, { "Age", 25 }, { "CreateTime", DateTime.Now } }; // 执行插入 int affectedRows = fsql.Insert<object>() .AsTable("Users") // 指定表名 .AppendData(dict) // 添加字典数据 .ExecuteAffrows(); ``` ### 2. 更新数据(Update) ```csharp // 更新条件(按ID更新) var whereDict = new Dictionary<string, object> { { "Id", 1001 } }; // 更新字段 var updateDict = new Dictionary<string, object> { { "Age", 26 }, { "UpdateTime", DateTime.Now } }; // 执行更新 int affectedRows = fsql.Update<object>() .AsTable("Users") .Set(updateDict) // 设置更新字段 .Where(whereDict) // 设置条件 .ExecuteAffrows(); ``` ### 3. 删除数据(Delete) ```csharp // 删除条件 var whereDict = new Dictionary<string, object> { { "Id", 1001 } }; // 执行删除 int affectedRows = fsql.Delete<object>() .AsTable("Users") .Where(whereDict) .ExecuteAffrows(); ``` ### 4. 查询数据(Read) ```csharp // 查询条件 var whereDict = new Dictionary<string, object> { { "Age", 25 } }; // 执行查询(返回动态对象列表) List<dynamic> results = fsql.Select<object>() .AsTable("Users") .Where(whereDict) .ToList<dynamic>(); // 遍历结果 foreach (dynamic item in results) { Console.WriteLine($"ID:{item.Id} 姓名:{item.Name} 年龄:{item.Age}"); } ``` ### 5. 执行原生 SQL ```csharp // 查询 List<dynamic> data = fsql.Ado.Query<dynamic>( "SELECT * FROM Users WHERE Age > @age", new { age = 20 } ); // 执行非查询 int affected = fsql.Ado.ExecuteNonQuery( "UPDATE Users SET Age = @age WHERE Id = @id", new { age = 30, id = 1001 } ); ``` ### 关键点说明: 1. **动态表名**:使用 `.AsTable("表名")` 指定操作的表 2. **字典传参**:通过 `Dictionary<string, object>` 动态构建字段数据 3. **动态结果**:使用 `ToList<dynamic>()` 接收查询结果 4. **原生 SQL**:通过 `fsql.Ado` 执行任意 SQL 语句 5. **参数化**:自动处理 SQL 注入防护,如 `@age` 参数 ### 性能优化建议: 1. 批量操作时使用 `ExecuteAffrows` 代替 `ExecuteInserted` 2. 复杂查询建议使用原生 SQL 3. 频繁操作时重用 `IFreeSql` 实例(单例模式) > 参考 FreeSql 文档:[FreeSql 动态列操作](https://github.com/dotnetcore/FreeSql/wiki/动态列)[^1],[FreeSql 原生 SQL 执行](https://github.com/dotnetcore/FreeSql/wiki/Ado)[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值