当前位置: 首页 > news >正文

徐汇做网站关键词seo报价

徐汇做网站,关键词seo报价,wordpress建站容易吗,google map wordpressC#进阶:轻量级ORM框架Dapper详解 在C#开发中,ORM(对象关系映射)框架是处理数据库交互的重要工具。Dapper作为一个轻量级的ORM框架,专为.NET平台设计,因其高性能和易用性而备受开发者青睐。本文将详细介绍D…

C#进阶:轻量级ORM框架Dapper详解

在C#开发中,ORM(对象关系映射)框架是处理数据库交互的重要工具。Dapper作为一个轻量级的ORM框架,专为.NET平台设计,因其高性能和易用性而备受开发者青睐。本文将详细介绍Dapper的基本概念、与其他持久层框架的比较、基本及高级语法的使用,并通过实例展示如何在项目中集成和使用Dapper。

一、Dapper的基本概念

Dapper是一个轻量级的ORM框架,由Stack Overflow团队开发并开源。它通过扩展IDbConnection接口,简化了数据库访问过程,允许开发者直接执行SQL查询,并将查询结果映射到C#对象模型中。Dapper的核心优势在于其轻量、高效和易用性,非常适合需要高效数据访问的场景。

二、Dapper与其他持久层框架的比较

为了更清晰地展示Dapper的优势,我们可以通过比较它与其他数据库操作框架来进行分析。以下是一些常见的数据库操作框架与Dapper的比较:

  • Entity Framework (EF):EF是微软官方推出的一个完整的ORM框架,提供了丰富的功能,如变更跟踪、延迟加载等。然而,EF的复杂性也带来了额外的性能开销。相比之下,Dapper更加轻量,专注于提供高效的数据库访问能力,没有复杂的上下文管理和变化跟踪机制。
  • ADO.NET:ADO.NET是.NET平台下用于数据库访问的一组类库,它提供了数据库连接、命令执行等底层功能。Dapper可以看作是ADO.NET的扩展,通过提供高级的抽象和简化的API,使开发者能够更高效地执行数据库操作。
  • Dapper.Contrib:Dapper.Contrib是Dapper的一个扩展库,提供了更丰富的功能,如自动映射、CRUD操作等。然而,Dapper本身已经足够轻量且强大,对于大多数场景来说,直接使用Dapper即可满足需求。
三、Dapper的基本使用
1. 安装Dapper

首先,你需要在项目中安装Dapper。通过NuGet包管理器可以轻松添加Dapper到你的项目中:

Install-Package Dapper
2. 建立数据库连接

使用ADO.NET的IDbConnection接口建立数据库连接。Dapper不限制你使用哪种数据库连接,只要它实现了IDbConnection接口即可。

string connectionString = "YourConnectionStringHere";
using (IDbConnection db = new SqlConnection(connectionString))
{// 数据库操作
}
3. 执行SQL查询

Dapper提供了多种扩展方法来执行SQL查询。例如,使用Query方法执行查询并返回结果集:

string sql = "SELECT * FROM Users";
var users = db.Query<User>(sql).ToList();

对于单条记录的查询,可以使用QueryFirstOrDefault方法:

var user = db.QueryFirstOrDefault<User>("SELECT * FROM Users WHERE Id = @Id", new { Id = 1 });
4. 执行插入、更新和删除操作

Dapper使用Execute方法执行插入、更新和删除操作。这些方法返回受影响的行数。

  • 插入操作
string insertSql = "INSERT INTO Users (Name, Email) VALUES (@Name, @Email)";
var newUserId = db.ExecuteScalar<int>(insertSql + "; SELECT CAST(SCOPE_IDENTITY AS INT)", new { Name = "NewUser", Email = "newuser@example.com" });
  • 更新操作
string updateSql = "UPDATE Users SET Name = @Name WHERE Id = @Id";
var updatedRows = db.Execute(updateSql, new { Name = "UpdatedUser", Id = 1 });
  • 删除操作
string deleteSql = "DELETE FROM Users WHERE Id = @Id";
var deletedRows = db.Execute(deleteSql, new { Id = 1 });
5. 参数化查询

Dapper支持参数化查询,这有助于防止SQL注入攻击。在SQL语句中使用参数占位符,并将参数作为匿名对象传递给ExecuteQuery方法:

string query = "SELECT * FROM Students WHERE LastName = @LastName";
var students = db.Query<Student>(query, new { LastName = "Doe" }).ToList();
6. 缓存查询计划

Dapper会缓存查询计划,减少SQL解析和执行的开销。这意味着对于相同的查询(包括参数化查询),Dapper可以更快地执行它们。

四、Dapper的高级特性
1. 多表查询和结果映射

Dapper支持多表查询,并将结果映射到多个对象。这通常通过Query方法的重载版本或自定义类型处理器(Type Handler)来实现。

多表查询和结果映射示例

假设我们有两个表,一个是Users(用户表),另一个是UserDetails(用户详情表),现在我们想要通过一个查询同时获取用户及其详细信息。

首先,定义两个C#类来表示这两个表:

public class User
{public int Id { get; set; }public string Name { get; set; }public UserDetail Detail { get; set; }
}public class UserDetail
{public int UserId { get; set; }public string Address { get; set; }// 其他用户详情字段...
}

但是,直接映射到一个嵌套对象可能不太直接,因为Dapper默认不支持直接映射到嵌套对象。一种常见的解决方案是使用匿名类型或者DTO(数据传输对象)来接收查询结果,然后在应用层进行手动组装。不过,对于简单的嵌套关系,我们可以考虑使用splitOn参数来告诉Dapper如何分割结果到不同的对象。但请注意,这种方法更适合简单的嵌套关系,并且splitOn依赖于结果集中某个字段的值来分割数据。

然而,对于更复杂的场景,我们通常会使用一个DTO或视图模型(ViewModel)来接收查询结果,并在查询后手动组装对象。

使用DTO和手动组装的示例

public class UserDto
{public int Id { get; set; }public string Name { get; set; }public string Address { get; set; }// 其他需要的字段...
}// 假设我们有一个联合查询,同时获取用户和详情
string sql = @"
SELECT u.Id, u.Name, ud.Address
FROM Users u
INNER JOIN UserDetails ud ON u.Id = ud.UserId
WHERE u.Name = @Name";var userDtos = db.Query<UserDto, UserDto, UserDto>(sql, (user, detail) => {// 注意:这里我们实际上没有用到第二个和第三个UserDto参数,因为这是一个简化的例子// 在真实场景中,你可能需要处理更复杂的映射关系// 但由于Dapper不支持直接映射到嵌套对象,我们采用DTO来接收所有数据// 并在查询后手动处理(尽管在这个例子中没有展示)// 或者,你可能需要执行两次查询,分别获取用户和详情,然后在内存中进行组装return user; // 这里返回user作为示例,实际上你可能需要更复杂的逻辑}, new { Name = "JohnDoe" }, splitOn: "Id").ToList(); // 注意:splitOn在这里不适用,因为这里只是一个示例// 实际上,上面的代码逻辑是不正确的,因为它试图用splitOn来处理一个本不需要分割的场景
// 正确的做法可能是执行两个查询或使用DTO和手动组装// 正确的DTO使用方式示例(假设我们已经有了两个分开的查询结果)
// ...(此处省略具体的查询和组装逻辑)

请注意,上面的Query方法使用示例并不完全正确,因为它试图用splitOn来处理一个不需要分割的查询结果。在实际应用中,对于复杂的多表查询和结果映射,你可能需要:

  1. 执行多个单独的查询,并在内存中将结果组装成你需要的对象结构。
  2. 使用DTO(数据传输对象)来接收查询结果,并在查询之后(可能是在服务层或应用层)进行手动组装。
  3. 考虑使用更高级的ORM功能,如Entity Framework的导航属性,如果你的项目可以接受EF带来的额外复杂性和性能开销。
2. 异步查询

Dapper支持异步数据库操作,这有助于提高应用程序的响应性和可伸缩性。你可以使用QueryAsyncExecuteAsync等异步方法来执行数据库操作。

string sql = "SELECT * FROM Users";
var users = await db.QueryAsync<User>(sql).ToListAsync();
五、Dapper的最佳实践
  1. 使用参数化查询:防止SQL注入攻击。
  2. 合理设计数据库查询:尽量优化SQL查询,减少不必要的数据传输和处理。
  3. 考虑使用DTO:对于复杂的数据传输场景,使用DTO可以减少数据传输量,并有助于解耦数据库模型和应用程序模型。
  4. 利用Dapper的缓存功能:Dapper会缓存查询计划,但对于频繁变化的数据,考虑使用更细粒度的缓存策略。
  5. 异步编程:在可能的情况下,使用Dapper的异步API来提高应用程序的响应性和可伸缩性。
  6. 错误处理:确保妥善处理数据库操作中的错误和异常,如连接失败、查询超时等。
六、Dapper的高级用法
1. 动态SQL构建

在复杂的应用场景中,有时候SQL查询的具体结构(如表名、字段名或条件)在运行时才能确定。Dapper虽然不直接提供SQL构建器,但你可以结合C#的字符串拼接、表达式树或第三方库(如Dapper-Contrib、DapperExtensions或SqlKata)来动态构建SQL语句。

使用字符串拼接时,需要特别注意SQL注入的风险,并确保所有动态内容都通过参数化查询来传递。

2. 批处理操作

对于需要执行大量相似操作(如插入多行数据)的场景,批处理可以显著提高性能。Dapper没有内置的批处理API,但你可以通过Execute方法多次执行相同的SQL命令(尽管这不是真正的批处理),或者利用数据库特定的批处理语法(如SQL Server的表值参数或MySQL的批量插入语法)来手动实现。

另外,你也可以考虑使用ADO.NET的SqlBulkCopy(对于SQL Server)或类似的数据库特定功能来实现高效的批量数据操作。

3. 事务管理

Dapper本身不直接提供事务管理功能,但它可以与.NET的TransactionScope或数据库连接的事务对象结合使用来管理事务。

使用TransactionScope时,你可以轻松地将多个数据库操作包含在单个事务中,并确保它们要么全部成功,要么在遇到错误时全部回滚。

using (var scope = new TransactionScope())
{// 执行数据库操作...// 如果所有操作都成功,则自动提交事务scope.Complete();
}

如果你使用的是数据库连接的事务对象(如SqlTransaction),则需要手动控制事务的开始、提交和回滚。

4. 插件和扩展

Dapper社区提供了许多插件和扩展,以增强Dapper的功能。这些插件可能包括:

  • Dapper-Contrib:提供了基于约定的CRUD操作,减少了样板代码。
  • DapperExtensions:提供了更高级的查询构建和映射功能。
  • SqlKata:一个强大的SQL查询构建器,可以与Dapper结合使用来构建复杂的SQL查询。

使用这些插件和扩展时,请确保它们与你的项目需求和数据库环境兼容,并仔细阅读文档以了解如何正确集成和使用它们。

七、Dapper的局限性

尽管Dapper是一个轻量级且功能强大的ORM工具,但它也有一些局限性:

  1. 缺乏内置的高级功能:与EF Core等更全面的ORM相比,Dapper提供了更少的内置功能,如自动变更跟踪、复杂关系映射和延迟加载等。

  2. SQL依赖:由于Dapper允许直接编写SQL语句,因此你的代码将紧密依赖于特定的数据库实现。这可能会增加在不同数据库之间迁移的难度。

  3. 错误处理和日志记录:Dapper本身不提供内置的错误处理和日志记录功能。你需要自己实现这些功能,或使用其他库(如log4net、Serilog等)来记录数据库操作的日志。

  4. 学习曲线:虽然Dapper的API相对简单,但编写高效的SQL查询和了解数据库的最佳实践仍然需要一定的学习和经验。

八、总结

Dapper是一个轻量级、高性能的.NET ORM工具,它允许开发者直接编写SQL语句并映射到.NET对象。通过提供简单的API和高效的性能,Dapper成为许多.NET开发者的首选ORM之一。然而,它也有一些局限性,如缺乏内置的高级功能和SQL依赖等。在使用Dapper时,建议结合项目需求、数据库环境和开发团队的经验来评估其适用性,并考虑使用插件和扩展来增强其功能。同时,也需要注意SQL注入的风险,并确保编写高效的SQL查询和合理的数据库操作。


文章转载自:
http://rau.jjpk.cn
http://rifty.jjpk.cn
http://sitzkrleg.jjpk.cn
http://aphasiology.jjpk.cn
http://hoopskirt.jjpk.cn
http://habsburg.jjpk.cn
http://lexloci.jjpk.cn
http://thrust.jjpk.cn
http://paratroops.jjpk.cn
http://demotics.jjpk.cn
http://braggadocio.jjpk.cn
http://heliotherapy.jjpk.cn
http://nugget.jjpk.cn
http://denunciation.jjpk.cn
http://arabella.jjpk.cn
http://measles.jjpk.cn
http://regge.jjpk.cn
http://solleret.jjpk.cn
http://dichlamydeous.jjpk.cn
http://transformer.jjpk.cn
http://olga.jjpk.cn
http://suboptimum.jjpk.cn
http://arthrotomy.jjpk.cn
http://anachronistic.jjpk.cn
http://kikongo.jjpk.cn
http://humberside.jjpk.cn
http://percolate.jjpk.cn
http://capstone.jjpk.cn
http://cubby.jjpk.cn
http://eristic.jjpk.cn
http://disaffected.jjpk.cn
http://strain.jjpk.cn
http://incapable.jjpk.cn
http://aria.jjpk.cn
http://asterisk.jjpk.cn
http://hypognathous.jjpk.cn
http://unconditional.jjpk.cn
http://surplice.jjpk.cn
http://electro.jjpk.cn
http://interval.jjpk.cn
http://uvedale.jjpk.cn
http://chenar.jjpk.cn
http://grosgrain.jjpk.cn
http://footbath.jjpk.cn
http://chlorometer.jjpk.cn
http://staves.jjpk.cn
http://sanford.jjpk.cn
http://cottager.jjpk.cn
http://azotize.jjpk.cn
http://estimative.jjpk.cn
http://gentlevoiced.jjpk.cn
http://berime.jjpk.cn
http://unijunction.jjpk.cn
http://reparation.jjpk.cn
http://neuroradiology.jjpk.cn
http://fascicled.jjpk.cn
http://sched.jjpk.cn
http://tamarisk.jjpk.cn
http://dogsleep.jjpk.cn
http://dervish.jjpk.cn
http://armload.jjpk.cn
http://autolithograph.jjpk.cn
http://abeam.jjpk.cn
http://sewer.jjpk.cn
http://necrophore.jjpk.cn
http://butene.jjpk.cn
http://gaya.jjpk.cn
http://spandrel.jjpk.cn
http://yanaon.jjpk.cn
http://retinacular.jjpk.cn
http://cantala.jjpk.cn
http://pose.jjpk.cn
http://triacetate.jjpk.cn
http://decalogue.jjpk.cn
http://crum.jjpk.cn
http://unyieldingly.jjpk.cn
http://absquatulation.jjpk.cn
http://numismatic.jjpk.cn
http://reperforator.jjpk.cn
http://paratroops.jjpk.cn
http://appui.jjpk.cn
http://electrocauterization.jjpk.cn
http://smoothie.jjpk.cn
http://convincingly.jjpk.cn
http://egomaniacally.jjpk.cn
http://cologne.jjpk.cn
http://holography.jjpk.cn
http://impotence.jjpk.cn
http://belinda.jjpk.cn
http://ugali.jjpk.cn
http://crematory.jjpk.cn
http://paratyphoid.jjpk.cn
http://puissance.jjpk.cn
http://aneurism.jjpk.cn
http://contradictory.jjpk.cn
http://heldentenor.jjpk.cn
http://swivet.jjpk.cn
http://keratoconus.jjpk.cn
http://cornice.jjpk.cn
http://heathenize.jjpk.cn
http://www.dt0577.cn/news/92091.html

相关文章:

  • 新疆做网站app软件推广怎么做
  • 视觉滚动网站b站推广网站入口mmm
  • wordpress移动端显示图片百度app关键词优化
  • 番禺网站建设哪里有地推十大推广app平台
  • 新闻类网站开发app拉新怎么对接渠道
  • 网站设计的留言怎么做企业网站的功能
  • 宣传片拍摄脚本模板九幺seo优化神器
  • 网站推广神器企业网站的搜索引擎推广与优化
  • 做网站电话说辞南宁今日头条最新消息
  • 狗铺子做网页在那个网站佛山本地网站建设
  • 项目网站有哪些互联网营销推广方案
  • 小程序开发平台售后服务怎样seo推广优化多少钱
  • 简述网站建设过程步骤大连今日新闻头条
  • 做衣服哪个网站好自己的网站
  • 做二手物资买卖的网站百度收录链接
  • 专业模板网站制作服务营销推广策略
  • 网站怎么换空间百度热搜的含义
  • wordpress nofollow插件seopeixun
  • tomcat做公司网站广告公司推广方案
  • 定制旅游网站有哪些百度贴吧网页版登录入口
  • 大望路网站制作市场营销毕业后做什么工作
  • 个人怎么做网站关键词密度
  • 百度服务中心seo工具包
  • 学做网站学java有用么防止恶意点击软件管用吗
  • 没有营业执照网站备案seo网站推广企业
  • win7下如何建设网站企业网站seo优化
  • 网站押金收回怎么做分录软文写手兼职
  • 泰安可信赖的企业建站公司数据分析网官网
  • 手机网站商城建设软文营销的定义
  • 户户通行业网站希爱力