当前位置:首页 > 科技  > 软件

.NET轻量级ORM框架Dapper.NET的高级应用实例详解

来源: 责编: 时间:2024-02-06 10:11:45 410观看
导读Dapper是一个轻量级的ORM(对象关系映射)库,用于.NET应用程序与数据库之间的数据访问。它允许你使用SQL查询来执行数据库操作,而不需要复杂的映射配置。在这篇文章中,我将为您提供Dapper的高级应用功能示例,每个示例都有源代

6g728资讯网——每日最新资讯28at.com

Dapper是一个轻量级的ORM(对象关系映射)库,用于.NET应用程序与数据库之间的数据访问。它允许你使用SQL查询来执行数据库操作,而不需要复杂的映射配置。在这篇文章中,我将为您提供Dapper的高级应用功能示例,每个示例都有源代码和注释。这些示例将涵盖Dapper的一些高级功能,以帮助你更好地理解如何在实际应用中使用它。6g728资讯网——每日最新资讯28at.com

示例1:多表关联查询

Dapper允许你轻松执行多表关联查询。在这个示例中,我们将查询两个表,一个是Customers表,另一个是Orders表,并将它们关联起来。6g728资讯网——每日最新资讯28at.com

using Dapper;using System;using System.Data;using System.Data.SqlClient;using System.Linq;public class Customer{    public int CustomerId { get; set; }    public string CustomerName { get; set; }}public class Order{    public int OrderId { get; set; }    public int CustomerId { get; set; }    public decimal TotalAmount { get; set; }}class Program{    static void Main()    {        string connectionString = "YourConnectionStringHere";        using IDbConnection dbConnection = new SqlConnection(connectionString);        string query = "SELECT c.CustomerId, c.CustomerName, o.OrderId, o.TotalAmount " +                       "FROM Customers c " +                       "JOIN Orders o ON c.CustomerId = o.CustomerId";        var result = dbConnection.Query<Customer, Order, Customer>(            query,            (customer, order) =>            {                customer.Orders = order;                return customer;            },            splitOn: "OrderId"        );        foreach (var customer in result)        {            Console.WriteLine($"Customer ID: {customer.CustomerId}, Name: {customer.CustomerName}");            Console.WriteLine($"Order ID: {customer.Orders.OrderId}, Total Amount: {customer.Orders.TotalAmount}");            Console.WriteLine();        }    }}

示例2:事务处理

Dapper允许你使用事务来确保一组操作要么全部成功,要么全部失败。在这个示例中,我们将演示如何在Dapper中使用事务。6g728资讯网——每日最新资讯28at.com

using Dapper;using System;using System.Data;using System.Data.SqlClient;class Program{    static void Main()    {        string connectionString = "YourConnectionStringHere";        using IDbConnection dbConnection = new SqlConnection(connectionString);        dbConnection.Open();        using var transaction = dbConnection.BeginTransaction();        try        {            string insertQuery = "INSERT INTO Products (Name, Price) VALUES (@Name, @Price)";            string updateQuery = "UPDATE Customers SET CustomerName = @CustomerName WHERE CustomerId = @CustomerId";            var product = new { Name = "ProductX", Price = 19.99 };            var customer = new { CustomerName = "NewName", CustomerId = 1 };            dbConnection.Execute(insertQuery, product, transaction: transaction);            dbConnection.Execute(updateQuery, customer, transaction: transaction);            // Commit the transaction if all operations are successful            transaction.Commit();            Console.WriteLine("Transaction committed.");        }        catch (Exception ex)        {            // Rollback the transaction if any operation fails            transaction.Rollback();            Console.WriteLine("Transaction rolled back. Error: " + ex.Message);        }    }}

示例3:自定义类型映射

Dapper允许你自定义数据类型到.NET类型的映射。在这个示例中,我们将使用TypeHandler来自定义Point类型的映射。6g728资讯网——每日最新资讯28at.com

using Dapper;using System;using System.Data;using System.Data.SqlClient;using Npgsql;using NpgsqlTypes;public class Point{    public double X { get; set; }    public double Y { get; set; }}public class PointTypeHandler : SqlMapper.TypeHandler<Point>{    public override void SetValue(IDbDataParameter parameter, Point value)    {        parameter.Value = $"({value.X},{value.Y})";        parameter.DbType = DbType.String;    }    public override Point Parse(object value)    {        if (value is string strValue)        {            var parts = strValue.Trim('(', ')').Split(',');            if (parts.Length == 2 && double.TryParse(parts[0], out double x) && double.TryParse(parts[1], out double y))            {                return new Point { X = x, Y = y };            }        }        return null;    }}class Program{    static void Main()    {        SqlMapper.AddTypeHandler(new PointTypeHandler());        string connectionString = "YourConnectionStringHere";        using IDbConnection dbConnection = new NpgsqlConnection(connectionString);        string query = "SELECT PointColumn FROM MyTable WHERE Id = @Id";        var result = dbConnection.Query<Point>(query, new { Id = 1 }).FirstOrDefault();        if (result != null)        {            Console.WriteLine($"X: {result.X}, Y: {result.Y}");        }        else        {            Console.WriteLine("Point not found.");        }    }}

示例4:批量插入

Dapper支持批量插入数据,这对于大规模数据操作非常有用。在这个示例中,我们将演示如何批量插入多个产品记录。6g728资讯网——每日最新资讯28at.com

using Dapper;using System;using System.Collections.Generic;using System.Data;using System.Data.SqlClient;public class Product{    public string Name { get; set; }    public decimal Price { get; set; }}class Program{    static void Main()    {        string connectionString = "YourConnectionStringHere";        using IDbConnection dbConnection = new SqlConnection(connectionString);        dbConnection.Open();        var products = new List<Product>        {            new Product { Name = "ProductA", Price = 10.99m },            new Product { Name = "ProductB", Price = 15.99m },            new Product { Name = "ProductC", Price = 20.99m }        };        string insertQuery = "INSERT INTO Products (Name, Price) VALUES (@Name, @Price)";        int rowsAffected = dbConnection.Execute(insertQuery, products);        Console.WriteLine($"{rowsAffected} rows inserted.");    }}

示例5:自定义SQL语句

虽然Dapper通常用于执行SQL查询,但你也可以执行自定义的SQL语句,例如存储过程或函数调用。在这个示例中,我们将演示如何执行一个存储过程。6g728资讯网——每日最新资讯28at.com

using Dapper;using System;using System.Data;using System.Data.SqlClient;class Program{    static void Main()    {        string connectionString = "YourConnectionStringHere";        using IDbConnection dbConnection = new SqlConnection(connectionString);        string storedProcedure = "MyStoredProcedure";        var parameters = new DynamicParameters();        parameters.Add("Param1", 123);        parameters.Add("Param2", "TestValue", DbType.String, ParameterDirection.Input, 50);        var result = dbConnection.Query<int>(storedProcedure, parameters, commandType: CommandType.StoredProcedure).FirstOrDefault();        Console.WriteLine($"Stored procedure result: {result}");    }}

示例6:自定义SQL语句执行

你可以使用Dapper的Execute方法来执行自定义的SQL语句,而不仅仅是查询。在这个示例中,我们将演示如何执行一个自定义的更新语句。6g728资讯网——每日最新资讯28at.com

using Dapper;using System;using System.Data;using System.Data.SqlClient;class Program{    static void Main()    {        string connectionString = "YourConnectionStringHere";        using IDbConnection dbConnection = new SqlConnection(connectionString);        string updateStatement = "UPDATE Customers SET CustomerName = @NewName WHERE CustomerId = @CustomerId";        var parameters = new { NewName = "NewName", CustomerId = 1 };        int rowsAffected = dbConnection.Execute(updateStatement, parameters);        Console.WriteLine($"{rowsAffected} rows updated.");    }}

示例7:异步查询

Dapper支持异步查询,这对于高并发应用程序非常有用。在这个示例中,我们将演示如何使用异步方法执行查询。6g728资讯网——每日最新资讯28at.com

using Dapper;using System;using System.Data;using System.Data.SqlClient;using System.Threading.Tasks;class Program{    static async Task Main()    {        string connectionString = "YourConnectionStringHere";        using IDbConnection dbConnection = new SqlConnection(connectionString);        string query = "SELECT * FROM Products";        var products = await dbConnection.QueryAsync<Product>(query);        foreach (var product in products)        {            Console.WriteLine($"Name: {product.Name}, Price: {product.Price}");        }    }}

示例8:自定义表名

你可以使用Dapper的Table特性来指定实体类与数据库中不同表之间的映射关系。在这个示例中,我们将演示如何自定义表名。6g728资讯网——每日最新资讯28at.com

using Dapper;using System;using System.Data;using System.Data.SqlClient;[Table("MyCustomTableName")]public class CustomTable{    public int Id { get; set; }    public string Name { get; set; }}class Program{    static void Main()    {        string connectionString = "YourConnectionStringHere";        using IDbConnection dbConnection = new SqlConnection(connectionString);        string query = "SELECT * FROM MyCustomTableName";        var result = dbConnection.Query<CustomTable>(query);        foreach (var item in result)        {            Console.WriteLine($"Id: {item.Id}, Name: {item.Name}");        }    }}

示例9:自定义参数前缀

Dapper默认使用@作为参数前缀,但你可以自定义参数前缀。在这个示例中,我们将演示如何自定义参数前缀为$6g728资讯网——每日最新资讯28at.com

using Dapper;using System;using System.Data;using System.Data.SqlClient;class Program{    static void Main()    {        SqlMapperExtensions.Configure("$$$"); // 设置参数前缀为 $$$        string connectionString = "YourConnectionStringHere";        using IDbConnection dbConnection = new SqlConnection(connectionString);        string query = "SELECT * FROM Products WHERE Name = $$$productName";        var result = dbConnection.Query<Product>(query, new { productName = "ProductA" });        foreach (var product in result)        {            Console.WriteLine($"Name: {product.Name}, Price: {product.Price}");        }    }}

示例10:查询分页

Dapper使分页查询变得容易,你可以使用LIMITOFFSET来执行分页查询。在这个示例中,我们将演示如何执行分页查询。6g728资讯网——每日最新资讯28at.com

using Dapper;using System;using System.Data;using System.Data.SqlClient;class Program{    static void Main()    {        string connectionString = "YourConnectionStringHere";        using IDbConnection dbConnection = new SqlConnection(connectionString);        int pageSize = 10;        int pageNumber = 2;        string query = "SELECT * FROM Products ORDER BY ProductId OFFSET @Offset ROWS FETCH NEXT @PageSize ROWS ONLY";        var result = dbConnection.Query<Product>(query, new { Offset = (pageNumber - 1) * pageSize, PageSize = pageSize });        foreach (var product in result)        {            Console.WriteLine($"Name: {product.Name}, Price: {product.Price}");        }    }}

这些示例演示了Dapper的一些高级功能,包括多表关联查询、事务处理、自定义类型映射、批量插入、自定义SQL语句、异步查询、自定义表名、自定义参数前缀和查询分页。通过这些示例,你可以更好地了解如何在实际应用中充分利用Dapper来简化数据访问任务。6g728资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-74665-0.html.NET轻量级ORM框架Dapper.NET的高级应用实例详解

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 学到了!Figma 原来是这样表示矩形的

下一篇: 文件系统那些事儿,你学会了吗?

标签:
  • 热门焦点
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾&ldquo;低价&rdquo;口号。而过去与他们错位竞争的拼多多,靠
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • iQOO Neo8系列或定档5月23日:首发天玑9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
  • Meta盲目扩张致超万人被裁,重金押注元宇宙而前景未明

    图片来源:图虫创意日前,Meta创始人兼CEO 马克&middot;扎克伯发布公开信,宣布Meta计划裁员超11000人,占其员工总数13%。他公开承认了自己的预判失误:&ldquo;不仅
Top