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.SupplierName
            FROM Materials m
            JOIN Suppliers s ON m.SupplierId = s.SupplierId
            WHERE 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.SupplierName
            FROM Materials m
            JOIN Suppliers s ON m.SupplierId = s.SupplierId
            WHERE 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.SupplierName
            FROM Materials m
            JOIN Suppliers s ON m.SupplierId = s.SupplierId
            ORDER 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,你可以更精细地控制查询的执行和结果的映射,这对于大型应用或性能敏感的应用来说是一个巨大的优势。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值