钟二网络头像

钟二网络

探索SQL查询技巧、Linux系统运维以及Web开发前沿技术,提供一站式的学习体验

  • 文章92531
  • 阅读740657
首页 SQL 正文内容

ef怎么写原生sql

钟逸 SQL 2025-05-25 19:00:37 4

EF支持在需要时编写原生SQL查询。这在以下情况下特别有用:

* 优化性能

* 查询不支持的LINQ表达式的数据库表

* 执行存储过程

* 对底层数据库进行高级操作

编写原生SQL查询

要编写原生SQL查询,请使用DbContext.Database.SqlQuery 。该 接受两个参数:

* **SQL查询字符串**:包含要执行的SQL查询的字符串。

* **参数**:可选参数数组,用于替换查询中的参数化值。

示例

using Microsoft.EntityFrameworkCore;

...

string sqlQuery = "SELECT * FROM Employees WHERE DepartmentId = @departmentId";

List employees = context.Database.SqlQuery(sqlQuery, new SqlParameter("@departmentId", 1)).ToList();

映射结果

默认情况下,SqlQuery 将返回一个对象列表,其中每个对象都具有与查询的列数相对应的属性。要自定义结果映射,可以使用MapTo 。

示例

using Microsoft.EntityFrameworkCore;

...

string sqlQuery = "SELECT * FROM Employees WHERE DepartmentId = @departmentId";

List employees = context.Database.SqlQuery(sqlQuery, new SqlParameter("@departmentId", 1)).ToList();

EmployeeInfo 类定义如下:

public class EmployeeInfo

{

public int EmployeeId { get; set; }

public string Name { get; set; }

}

使用存储过程

EF还支持执行存储过程。为此,请使用DbContext.Database.ExecuteSqlCommand 。

示例

using Microsoft.EntityFrameworkCore;

...

string storedProcName = "GetEmployeesByDepartment";

context.Database.ExecuteSqlCommand(storedProcName, new SqlParameter("@departmentId", 1));

优点

* 在需要时提供对底层数据库的更精细控制。

* 优化复杂查询的性能。

* 访问不支持LINQ表达式的数据库表。

缺点

* 更加底层,需要更深入了解SQL。

* 绕过EF的实体跟踪功能,可能导致对象状态不一致。

* 查询不是类型安全的,需要小心处理结果。

文章目录
    搜索