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

EFCore中结合Dapper执行SQL任意查询

如何在 Entity Framework Core (EF Core) 中使用任意 SQL 查询(特别是多表关联查询),以及在执行复杂查询时使用 Dapper 的好处和优点的文章。这篇文章将涵盖以下内容:

  • EF Core 中的任意 SQL 查询(多表关联查询)。
  • Dapper 的介绍和优势。
  • Dapper 的配置和使用。

EF Core 中的任意 SQL 查询与 Dapper 的使用
1. EF Core 中的任意 SQL 查询
1.1 什么是任意 SQL 查询?
任意 SQL 查询指的是在 EF Core 中直接使用 SQL 语句执行查询,而不是通过 LINQ 查询表达式。这在需要执行复杂的 SQL 语句或多表关联查询时非常有用。

1.2 使用 FromSqlInterpolated 执行多表关联查询
在 EF Core 中,你可以使用 FromSqlInterpolated 方法执行任意 SQL 查询。下面是一个使用 FromSqlInterpolated 执行多表关联查询的示例。

示例代码
假设我们有两个表:Materials 和 Suppliers,以及相应的实体类型 Material 和 Supplier。

public class Material
{public int MaterialId { get; set; }public string MaterialName { get; set; }public decimal Price { get; set; }public int SupplierId { get; set; }public Supplier Supplier { get; set; }
}public class Supplier
{public int SupplierId { get; set; }public string SupplierName { get; set; }
}

1.3 执行多表关联查询

public static void SqlTextQueryMultiTable()
{using (var mydb = new MyDbContext()){FormattableString sql = $@"SELECT m.MaterialId, m.MaterialName, m.Price, s.SupplierId, s.SupplierNameFROM Materials mJOIN Suppliers s ON m.SupplierId = s.SupplierIdWHERE m.MaterialName LIKE '%{param}%'ORDER BY newid();";// 执行多表关联查询var list = mydb.Materials.FromSqlInterpolated(sql);// 处理查询结果foreach (var item in list){Console.WriteLine(item.MaterialName);}}
}

1.4 注意事项

  • 列名匹配:结果集中的列名必须与实体属性映射到的列名称匹配。
  • 返回所有列:查询必须返回与实体类型对应的数据库表的所有列。
  • 单表查询:FromSqlInterpolated
    主要用于单表查询。对于多表关联查询,你需要预先知道所有参与关联的表的列,并且确保结果集中的列名与实体属性相匹配。

2. 使用 Dapper 的好处和优点
2.1 Dapper 介绍
Dapper 是一个轻量级的 ORM 工具,它专注于快速和简单的数据访问。与 EF Core 相比,Dapper 更加轻巧,性能更高,特别适合执行复杂的 SQL 查询。

2.2 Dapper 的优势

  • 高性能:Dapper 通常比 EF Core 更快,因为它更轻量级,没有 EF Core 中的许多额外开销。

  • 简单易用:Dapper 的 API 设计简单直观,易于学习和使用。

  • 灵活性:Dapper 支持复杂的 SQL 查询,包括多表关联查询和存储过程。

  • 更好的控制:Dapper 允许你更精细地控制查询的执行和结果的映射。

  • 手动映射:Dapper 不会自动映射查询结果到实体,这使得你可以精确控制如何映射数据。

3.Dapper 的配置和使用
3.1 安装 Dapper
首先,你需要安装 Dapper NuGet 包。在 Visual Studio 中打开 Package Manager 控制台,并运行以下命令:

Install-Package Dapper

3.2 使用 Dapper 执行多表关联查询
假设我们有相同的 Materials 和 Suppliers 表,下面是一个使用 Dapper 执行多表关联查询的示例。

示例代码

public class MaterialSupplierDto
{public int MaterialId { get; set; }public string MaterialName { get; set; }public decimal Price { get; set; }public int SupplierId { get; set; }public string SupplierName { get; set; }
}public static void DapperSqlTextQueryMultiTable(string param)
{using (var connection = new SqlConnection("YourConnectionStringHere")){connection.Open();string sql = $@"SELECT m.MaterialId, m.MaterialName, m.Price, s.SupplierId, s.SupplierNameFROM Materials mJOIN Suppliers s ON m.SupplierId = s.SupplierIdWHERE m.MaterialName LIKE '%{param}%'ORDER BY newid();";// 执行多表关联查询var list = connection.Query<MaterialSupplierDto>(sql);// 处理查询结果foreach (var item in list){Console.WriteLine(item.MaterialName);}}
}

3.3 映射复杂查询结果
在 Dapper 中,你可以使用 Query 方法来映射查询结果到 DTO(Data Transfer Object)。如果查询结果很复杂,你可以使用 Map 方法来手动映射结果。

示例代码

public static void DapperSqlTextQueryComplex()
{using (var connection = new SqlConnection("YourConnectionStringHere")){connection.Open();string sql = @"SELECT m.MaterialId, m.MaterialName, m.Price, s.SupplierId, s.SupplierNameFROM Materials mJOIN Suppliers s ON m.SupplierId = s.SupplierIdORDER BY newid();";// 执行多表关联查询var list = connection.Query<MaterialSupplierDto, Supplier, MaterialSupplierDto>(sql,(material, supplier) =>{material.Supplier = supplier;return material;},splitOn: "SupplierId");// 处理查询结果foreach (var item in list){Console.WriteLine($"{item.MaterialName} - {item.SupplierName}");}}
}

3.4 使用 Dapper 的其他技巧

  • 分页:使用 QueryMultiple 方法可以轻松实现分页。
  • 存储过程:Dapper 支持调用存储过程。
  • 性能优化:使用 BulkCopy 或 Execute 方法可以提高插入、更新和删除操作的性能。

结论
在 EF Core 中使用任意 SQL 查询可以让你更灵活地执行复杂的多表关联查询。然而,当查询变得更加复杂时,Dapper 提供了更好的性能和灵活性。通过使用 Dapper,你可以更精细地控制查询的执行和结果的映射,这对于大型应用或性能敏感的应用来说是一个巨大的优势。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 初识C++:开启C++之旅
  • Angular组件概念
  • 基于 Android studio 实现停车场管理系统--原创
  • Java String 去掉特殊字符之前的内容方法
  • 实训日记day29
  • 主成分分析(PCA)
  • 自然语言处理(NLP)--数据增强
  • 文本纠错实现定位与标记
  • JMeter进阶技巧:参数化与数据驱动测试
  • Polars简明基础教程八:Series 和 DataFrame 以及它们之间的转换_B
  • Qt窗口交互场景、子窗口数据获取
  • AcWing 723. PUM
  • 改善工作流
  • Spring Boot如何实现数据脱敏?
  • 在Spring Boot中使用MyBatis实现复杂查询和分页功能
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • ES6之路之模块详解
  • extract-text-webpack-plugin用法
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaWeb(学习笔记二)
  • JAVA之继承和多态
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • React-生命周期杂记
  • sublime配置文件
  • Swoft 源码剖析 - 代码自动更新机制
  • 安装python包到指定虚拟环境
  • 从0实现一个tiny react(三)生命周期
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 机器学习中为什么要做归一化normalization
  • 计算机常识 - 收藏集 - 掘金
  • 如何进阶一名有竞争力的程序员?
  • 小程序01:wepy框架整合iview webapp UI
  • 原生Ajax
  • gunicorn工作原理
  • #1014 : Trie树
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $refs 、$nextTic、动态组件、name的使用
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (152)时序收敛--->(02)时序收敛二
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Java入门)学生管理系统
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (二十四)Flask之flask-session组件
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (简单) HDU 2612 Find a way,BFS。
  • (三)模仿学习-Action数据的模仿
  • (一)、python程序--模拟电脑鼠走迷宫
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)GCC在C语言中内嵌汇编 asm __volatile__