C# 如何在 EF Core 中执行原生 SQL 查询_C# EF Core 原生 SQL 查询方法

<p>使用EF Core执行原生sql可通过FromSqlRaw查询实体数据,如context.Products.FromSqlRaw(“select FROM Products WHERE Price > {0}”, 100);执行非查询操作使用ExecuteSqlRaw,如批量更新context.database.ExecuteSqlRaw(“UPDATE Products SET Price = Price 1.1 WHERE CategoryId = {0}”, categoryId);查询非实体类型数据可结合ADO.net,通过context.Database.GetDbConnection()执行复杂查询并读取结果;推荐使用FromSqlinterpolated实现参数内插,如FromSqlInterpolated($”SELECT * FROM Products WHERE Price > {minPrice}”),自动参数化更安全。</p>

C# 如何在 EF Core 中执行原生 SQL 查询_C# EF Core 原生 SQL 查询方法

在使用 C# 的 EF Core 时,虽然 linq 查询已经非常强大,但在某些复杂场景下,比如多表联查、聚合统计或调用数据库函数时,直接执行原生 SQL 更加灵活高效。EF Core 提供了多种方式来执行原生 SQL 查询,既能查询数据,也能执行插入、更新、删除等操作。

使用 FromSqlRaw 执行查询

当需要从数据库中查询实体数据时,FromSqlRaw 是最常用的方法。它允许你在 DbSet 上执行原始 SQL 查询,返回的结果必须映射到实体类型。

例如,假设你有一个 Product 实体:

public class Product { public int Id { get; set; } public String Name { get; set; } public decimal Price { get; set; } }

你可以这样执行原生 SQL 查询:

var products = context.Products.FromSqlRaw(“SELECT * FROM Products WHERE Price > {0}”, 100).ToList();

注意:SQL 中的参数应使用 {0} 占位符,避免拼接字符串,防止 SQL 注入。

执行非查询语句(INSERT、UPDATE、delete

对于不返回数据的操作,如修改或删除,可以使用 ExecuteSqlRaw 方法。

例如,批量更新价格:

context.Database.ExecuteSqlRaw(“UPDATE Products SET Price = Price * 1.1 WHERE CategoryId = {0}”, categoryId);

这个方法返回受影响的行数,适合用于写操作。

C# 如何在 EF Core 中执行原生 SQL 查询_C# EF Core 原生 SQL 查询方法

蓝心千询

蓝心千询是vivo推出的一个多功能AI智能助手

C# 如何在 EF Core 中执行原生 SQL 查询_C# EF Core 原生 SQL 查询方法 34

查看详情 C# 如何在 EF Core 中执行原生 SQL 查询_C# EF Core 原生 SQL 查询方法

查询非实体类型的数据

有时候你需要查询的数据并不对应某个实体类,比如统计结果或视图数据。这时可以结合 Ado.NET 使用原生 ADO 操作。

通过 Database.GetDbConnection() 获取连接:

using var connection = context.Database.GetDbConnection();
connection.Open();
using var command = connection.CreateCommand();
command.CommandText = “SELECT CategoryName, count(*) as Count FROM Products p JOIN Categories c ON p.CategoryId = c.Id GROUP BY CategoryName”;
using var reader = command.ExecuteReader();
while (reader.Read()) {
  console.WriteLine($”{reader[“CategoryName”]}: {reader[“Count”]}”);
}

这种方式适用于无法映射到实体的复杂查询。

使用 FromSqlInterpolated 简化参数传递

EF Core 还提供了 FromSqlInterpolated,支持字符串内插语法,写起来更直观:

var minPrice = 50;
var products = context.Products.FromSqlInterpolated($”SELECT * FROM Products WHERE Price > {minPrice}”).ToList();

它会自动处理参数化,安全性高,推荐在支持的场景中使用。

基本上就这些。根据实际需求选择合适的方法:查询实体用 FromSqlRawFromSqlInterpolated,执行命令用 ExecuteSqlRaw,复杂结果集则搭配 ADO.NET 处理。只要注意参数化和映射问题,原生 SQL 在 EF Core 中用起来很顺手。

上一篇
下一篇
text=ZqhQzanResources